
算法与数据结构
文章平均质量分 63
Frimish
这个作者很懒,什么都没留下…
展开
-
25匹马,5个赛道,取前3
一共有25匹马,有一个赛场,赛场有5个赛道,就是说最多同时可以有5匹马一起比赛。假设每匹马都跑的很稳定,不用任何其他工具,只通过马与马之间的比赛,试问最少得比多少场才能知道跑得最快的5匹马? 思路:先将25匹马分成五组,进行五场比赛。第六场比赛可以考虑都取各个小组的第一名(或第二名)。假设都取各小组的第一名,根据这场比赛的排名,将原来的小组分别编号为a、b、c、d、e,并将原来的25匹原创 2015-07-12 15:37:46 · 2225 阅读 · 0 评论 -
吃透红黑树
接下载:http://www.cs.princeton.edu/~rs/talks/LLRB/RedBlack.pdf------------------------------红黑树系列,六篇文章于今日已经完成:1、教你透彻了解红黑树2、红黑树算法的实现与剖析3、红黑树的c源码实现与剖析4、一步一图一代码,R-B Tree5、红黑树插入和删除结点的全程演示6、红黑树的c++完转载 2015-12-23 14:09:23 · 472 阅读 · 0 评论 -
从1亿个ip中找出访问次数最多的IP
问题一: 怎么在海量数据中找出重复次数最多的一个算法思想: 方案1:先做hash,然后求模映射为小文件,求出每个小文件中重复次数最多的一个,并记录重复次数。 然后找出上一步求出的数据中重复次数最多的一个就是所求(如下)。 问题二: 网站日志中记录了用户的IP,找出访问次数最多的IP。原创 2015-09-22 23:50:56 · 6421 阅读 · 2 评论 -
100亿个数取出最大的10000个
题目:100亿个整数,求最大的1万个数,并说出算法的时间复杂度 算法:如果把100亿个数全部读入内存,需要100 0000 0000 * 4B 大约40G的内存,这显然是不现实的。 我们可以在内存中维护一个大小为10000的最小堆,每次从文件读一个数,与最小堆的堆顶元素比较,若比堆顶元素大, 则替换掉堆顶元素,然后调整堆。最后剩下的堆内元素即为最大的1万个数,算法复杂度为O(NlogN)原创 2015-10-26 10:42:46 · 3723 阅读 · 0 评论 -
稳定排序和不稳定排序
首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj,Ai原来在位置前,排序后Ai还是要在Aj位置前。 其次,说一下稳定性的好处。排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就是这样,先按低位排原创 2015-10-13 12:57:14 · 532 阅读 · 0 评论 -
腾讯笔试题:找数目超过总数目一半的红包金额
现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数。分析:设数A出现次数超过一半。每次删除两个不同的数,在剩余的数中,数A出现的次数仍超过一半。通过重复这个过程,求出最后的结果。这个题目与编程之美中寻找水王相同 [cpp] view plaincopy#include using namespa原创 2015-09-17 16:50:32 · 1303 阅读 · 0 评论 -
格雷码的生成
问题:产生n位元的所有格雷码。格雷码(Gray Code)是一个数列集合,每个数使用二进位来表示,假设使用n位元来表示每个数字,任两个数之间只有一个位元值不同。例如以下为3位元的格雷码: 000 001 011 010 110 111 101 100 。如果要产生n位元的格雷码,那么格雷码的个数为2^n.假设原始的值从0开始,格雷码产生的规律是:第一步,改变最右边的转载 2015-09-16 16:25:52 · 745 阅读 · 0 评论 -
从连续数字中寻找缺失的数字
给出一个包含 0 .. N 中 N 个数的序列,找出0 .. N 中没有出现在序列中的那个数。您在真实的面试中是否遇到过这个题? Yes样例N = 4 且序列为 [0, 1, 3] 时,缺失的数为2。注意可以改变序列中数的位置。挑战在数组上原地完成,使用O(1)的额外空间和O(N)的时间。分析:感原创 2015-09-25 10:05:54 · 2441 阅读 · 0 评论 -
链表总结
一、单链表结点的删除0、删除单链表p指向的那个元素,(时间和空间复杂度尽量小)二、单链表的存取1、找出单链表的倒数第K个元素,(仅允许遍历一遍链表)2、找出单链表的中间元素,(仅允许遍历一遍链表)三、单链表与环的问题3、判断单链表是否有环(6形状)?4、如何找到环的入口?5、如何知道环的长度?6、带环链表的原创 2015-08-14 21:57:36 · 734 阅读 · 0 评论 -
内存分配栈和堆的区别
对于一个程序要运行,涉及到的内存分配是一个首要问题,这里简单说一下一个简单的程序运行所涉及到的内存分配方式。另外,在数据结构中存在堆和栈的概念,栈是一种先进后出的数据结构,堆则是一种排序方式,而在内存分配中也存在堆(heap)和栈(stack)的概念,与数据结构中的概念不同,这里简单说明在内存分配中的堆栈之间的不同。一、内存分配方式1、全局变量和静态变量(static变量),是由编译器自动原创 2015-07-21 12:55:38 · 570 阅读 · 0 评论 -
C语言结构体、C++结构体和C++类的解析
1.C的结构体和C++结构体的区别 1.1 C的结构体内不允许有函数存在,C++允许有内部成员函数,且允许该函数是虚函数。所以C的结构体是没有构造函数、析构函数、和this指针的。 1.2 C的结构体对内部成员变量的访问权限只能是public,而C++允许public,protected,private三种。 1.3 C语言的结构体是不可以继承的,C++的结构体原创 2015-07-18 20:21:44 · 765 阅读 · 0 评论 -
KMP算法
KMP是解决判断B是否是A(A是否是B)的连续子串的问题(发现自己已经好久没有用pascal写代码了啊) 假如,A="abababaababacb",B="ababacb",我们来看看KMP是怎么工作的。我们用两个指针i和j分别表示,A[i-j+ 1..i]与B[1..j]完全相等。也就是说,i是不断增加的,随着i的增加j相应地变化,且j满足以A[i]结尾的长度为j的字符串正好匹配B串的前原创 2015-07-18 23:16:36 · 515 阅读 · 0 评论 -
判断一个数中有多少个1
碰到这个问题的一开始,大家都想当的是把数字转化成二进制数然后再进行判断并不是最好的,下面提供一种位运算的方法:把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以做多少这样次这样的操作。基于这种思路,我们可以写出新的代码:int NumberOf1( int n){int count = 0;while (n){+原创 2015-08-09 21:20:57 · 4751 阅读 · 0 评论 -
对象引用(object reference)与对象指针的区别
★ 相同点: 1. 都是地址的概念; 指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。 ★ 区别: 1. 指针是一个实体,而引用仅是个别名; 2. 引用使用时无需解引用(*),指针需要解引用; 3. 引用只能在定义时被初始化一次,之后不可变;指针可变; 引用“从一而终” ^_^转载 2015-07-16 11:02:14 · 1209 阅读 · 0 评论 -
B树、B-树、B+树、B*树的区别
B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关原创 2015-08-09 15:35:19 · 1095 阅读 · 0 评论 -
AVL
我们在树, 二叉树, 二叉搜索树中提到,一个有n个节点的二叉树,它的最小深度为log(n),最大深度为n。比如下面两个二叉树:深度为n的二叉树深度为log(n)的二叉树这两个二叉树同时也是二叉搜索树(参考树, 二叉树, 二叉搜索树)。注意,log以2为基底。log(n)是指深度的量级。根据我们对深度的定义,精确的最小深度为floor(log(n)+1原创 2015-08-09 16:06:39 · 1098 阅读 · 0 评论 -
随机洗牌算法
算法一:就是随机一个位置放入队列中的一个书,位置上已经有数则重新随机一个位置,直到队列空算法(Java):public HashSet getRamdomNumber(int total,int number){ //在0到total-1中随机生成number个不重复的随机数 HashSet h=new HashSet(); wh原创 2015-07-25 19:43:40 · 903 阅读 · 0 评论 -
关于strcpy和memcpy
出处:http://hi.baidu.com/yuanwenxue/item/df9976994b0024db7a7f01ef6.2 字符串与数组字符串一般是用字符数组的方式存储,例如下面的str定义:char str[] = "123456";这里str是一个字符数组,它存放了一个字符串"123456",由于字符串还有一个结束符"\0",所以此数组的长度为7而不是6。6.2.1转载 2015-07-12 16:05:53 · 568 阅读 · 0 评论 -
两个软硬程度一样的鸡蛋,它们在某一层摔下会碎,有个100层的建筑,要求最多用两个鸡蛋确 定鸡蛋安全下落的临界位置,给出临界位置?如果是n层楼,m个鸡蛋,请给出确定临界位置的算法
题目:问题:一幢大楼共计100层,某种类型的鸡蛋从某一楼层及其以上楼层摔下来时会被打破,从该层楼(即临界楼层)以下楼层摔下该鸡蛋,鸡蛋不会出现破损。现给你2个完全一样的该种类型的鸡蛋,问:如何通过这2个鸡蛋找到该临界楼层时,所用的摔鸡蛋次数最少? 思考:给了我们2个鸡蛋,意思就很明显,有1个鸡蛋起到关键作用,它可以被打破,以告诉我们临界楼层大致在什么位置。初探:原创 2015-12-25 11:32:07 · 6805 阅读 · 0 评论