算法与数据结构,是否可以归到“09. IT与数学”中?
摘要:字典树是什么,到wiki或者百度百科看一下就可以了,从名字也可以想象得到,这里我就不把定义再打一遍了,从网上找了一个实现,然后自己做了一个实现,这里记录一下。
字典树有几种具体的实现方式,有基于hash的,有基于平衡树的,还有二级字典树等。
字典树是典型的用空间来换时间的算法。
字典树主要的方法就是插入和查找
字典树又称为Trie。
阅读全文
摘要:这个题目来源于某公司的面试题,是absolute同学在我的“面试题收集贴”中提出的,之后CMGS同学在回复中提到,腾讯今年的面试题中有类似题目,问题规模扩大了10倍,但是本质相同。下面我们来看一下题目:
10亿个正整数,只有其中1个数重复出现过,要在O(n)的时间里面找出这个数,内存要尽可能少(小于100M)。
阅读全文
摘要:大家已经知道这是腾讯今年的面试题之一,也可能是其他一些公司的面试题中的一个。同时最初是出现在《编程珠玑》中,我们来分析它,是为了了解这道题目如何解决,而不单单是得到一种大约的方法就足够,还是了解清楚。
10亿个正整数,只有其中1个数重复出现过,要在O(n)的时间里面找出这个数,内存要尽可能少(小于100M)。
阅读全文
摘要:快速排序,最常用的那种,就是选择数组中的第一个元素,之后对后面的元素,比该元素小的放在该元素的左边,比该元素大的放在该元素的右边。然后对于左边和右边两个子数组,同样进行上面的过程,一直到子数组的数目为1停止。
快速排序平均的时间复杂度是O(lgn)。快速排序属于不稳定排序。
阅读全文
摘要:飞机上有100个座位,按顺序从1到100编号。有100个乘客,他们分别拿到了从1号到100号的座位,他们按号码顺序登机并应当对号入座,如果他们发现对应号座位被别人坐 了,他会在剩下空的座位随便挑一个坐。现在假如1号乘客疯了 -_-! (其他人没疯),他会在100个座位中随机座一个座位。那么第100人正确坐自己坐位的概率是多少?
阅读全文
摘要:原题:用递归求第10个数,它等于前2数之和,如{1,1,2,3,5}
得到递归式为f(n)=f(n-1)+f(n-2),终止条件为f(0)=1, f(1)=1。求的数为f(9)。
阅读全文
摘要:说到递归的题目,一般自然就会想到阶乘、斐波那契以及谭老师的汉诺塔;那说到递归的数据结构呢,当然是树结构了。
可以说树天生是合适进行递归的
阅读全文
摘要:关于链表的内容差不多了,现在是关于递归的部分。递归作为常常使用到的技术,也是面试时最容易被考到的部分,值得去理解,去思考。
这个比较简单,计算从1到100的累加,用递归来实现。
阅读全文
摘要:周末到了,首先祝大家周末愉快。可怜我周末都没得休息,继续努力 :)大家该哈皮的去哈皮吧。
昨天,其实从前天开始就开始准备约瑟夫环,昨晚就准备开始写,不过想来想去对其数学推导出递推式还是没有想明白。大家有空帮忙看看,到底这个递推式是怎么出来的呢?我下面会一步步将自己的思考列下来。多谢多谢。
一开始将题目和模拟法稍微写一下,之后是关于数学方法的疑惑,大家可以直接略过上面的一些内容,跳到关键部分。
阅读全文
摘要:前面完成了三个比较完整的链表程序。下面就是使用模板类来实现这个链表程序了。
阅读全文
摘要:前面我们已经实现了链表的C语言版本,并看了现实中的实现,现在来实现C++版本。C++的话,就有类,有构造函数,析构函数。但是这里实现链表不需要使用到继承,没有继承也就没有多态,只是封装。
列出参考书籍和网址:
参考《C++标准程序库》,由侯捷、孟岩翻译,在166页开始讲解list的部分。
侯捷的《STL源码分析》
阅读全文
摘要:今天来看看C实现的链表的经典,也就是linux内核中使用的链表形式。内核代码是在www.kernel.org/处下载的。这里选择了最新的源码包进行下载,为linux-2.6.31.1。其实链表作为最常用的数据结构,应该是变化不大的,虽然没有比较过,但是如果你下载2.4的内核代码,链表部分应该还是一样的。
阅读全文
摘要:到这里为止,所有C相关的实现暂时已经完成,里面的代码经过一些不完整的测试,如果有问题,非常感谢能够提供给我,我会尽快将其进行更新。
下面就是对C相关网络上找到的较为可靠的实现进行的分析
阅读全文
摘要:这一篇来实现反转链表,反转链表应该算是链表操作中比较麻烦一些的操作,也是面试中常常会被问到的。可以用递归和非递归的方式来进行解决,这里我们先使用非递归的方式,然后使用递归来做。
阅读全文
摘要:这篇会实现3个函数,包括删除一个节点,查找节点,以及合并两个链表。
阅读全文
摘要:这篇会开始进行链表函数的实现,这里先实现两个函数。
阅读全文
摘要:首先根据第四篇中的原则,将想要实现的链表操作确定下来
1.添加
void addnode(listnode* header, listnode* newnode, int pos);
2.删除
void deletenode(listnode* header, int pos)
3.遍历
void printlist(listnode *header)
4.倒序
void reverselist(listnode *header)
5.两个链表合并
void combinelist(listnode *header, listnode *list2)
6. 查找特定节点
listnode* findnode(listnode *header, int pos)
阅读全文