随笔分类 -  数据结构与算法分析

摘要:判断链表是否有环,定义指针一快(走2部)一慢(走1部),相遇即有环。 两个指针,一快一慢,有环,则相遇必在环内,找出相遇节点 接下来,就可以统计环中节点个数,找出环的入口节点 设节点个数为n,快指针先走n步,然后快慢指针一起一步一步走,相遇节点即环入口节点。 阅读全文
posted @ 2016-10-26 17:36 Lunais 阅读(573) 评论(0) 推荐(0)
摘要:求出将1元,5元,10元,20元凑成n(n>50)的方法的个数,并输出组合结果。 F(N,M)=F(N,M-1)+F(N-VAL[M],M) F(N,M)表示 用不超过第M个值的数来表示N 的所有组合方案 阅读全文
posted @ 2016-10-20 22:33 Lunais 阅读(205) 评论(0) 推荐(0)
摘要:void print_by_level_2(treeNode* Root) { if(! Root) return; deque dequeTreeRoot; dequeTreeRoot.push_back(Root); while(!dequeTreeRoot.empty()) { treeNode *temp... 阅读全文
posted @ 2016-10-05 22:32 Lunais 阅读(303) 评论(0) 推荐(0)
摘要:原文链接:http://blog.csdn.net/feliciafay/article/details/6816871 PreOrder: GDAFEMHZ InOrder: ADEFGHMZ PostOrder: AEFDHZMG 现在,假设仅仅知道前序和中序遍历,如何求后序遍历呢?比如,已知一 阅读全文
posted @ 2016-10-05 21:38 Lunais 阅读(803) 评论(0) 推荐(0)
摘要:一、二叉树的非递归遍历 先序遍历: 1、根节点p不为空,打印,根节点入栈,并将左孩子作为当前节点,左孩子即当前节点不为空,打印。。。一个while搞定 2、若左孩子为空,跳出while循环;if stack 不为空,top栈顶作为当前节点,pop栈顶,将当前节点的右孩子作为当前节点 中序遍历:(跟前 阅读全文
posted @ 2016-09-12 22:01 Lunais 阅读(6948) 评论(1) 推荐(1)
摘要:在大数查找中会遇到一类问题,例如在100亿条数据中找出 最大的(最小的) 前1000个元素。以int型4Byte为例,有1*1010*4 B = 4*1010/(230) B = 37.25G。 直接读取到内存中显然不合适,那么就需要: 首先,读取前1000个元素,建立一个最小堆(最大堆); 其次, 阅读全文
posted @ 2016-06-28 22:34 Lunais 阅读(447) 评论(0) 推荐(0)
摘要:按照C的约定,对于所有排序,数据都将在位置0处开始。 对于数字可使用“<”和“>”;对于字符串使用strcmp和strcpy。 排序法 平均时间 最差情形 稳定度 额外空间 备注 冒泡 O(n2) O(n2) 稳定 O(1) n小时较好 插入 O(n2) O(n2) 稳定 O(1) 大部分已排序时较 阅读全文
posted @ 2016-06-28 21:25 Lunais 阅读(279) 评论(0) 推荐(0)
摘要:在打印机作业时一般采用队列的形式FIFO(fisrt in first out),但遇到一个1份的和一个100份的作业时,先打印1份的相对合理;另外,不同作业的优先级也不同,优先级高的应该先处理。 insert == Enqueue deleteMin == Dequeue 二叉堆(完全二叉树):除 阅读全文
posted @ 2016-06-14 16:57 Lunais 阅读(321) 评论(0) 推荐(0)
摘要:数据处理中数据匹配常用到Qmap和QHash。 QHash查找速度上显著于QMap QHash以任意的方式进行存储,而QMap则是以key顺序进行存储。 散列表的实现常叫做散列(hashing),以常数平均时间插入、删除、查找。 散列原理:当输入一个关键字后,根据散列函数将其散列到表中一个位置,当位 阅读全文
posted @ 2016-06-11 22:33 Lunais 阅读(392) 评论(0) 推荐(0)
摘要:一、二叉树 定义:每个节点都不能有多于两个的儿子的树。 二叉树节点声明: 应用: 中缀表达式——>后缀表达式(栈的应用)——>表达式树(栈的应用2) 栈的应用2:读取后缀表达式,操作数入栈,遇操作符后,指向栈里前两位元素t1和t2的指针出栈(t1先弹出,作为该操作符的右儿子),并将指向该操作符的指针 阅读全文
posted @ 2016-06-07 22:57 Lunais 阅读(1706) 评论(0) 推荐(0)
摘要:队列的数组实现,从队尾进入,对头删除。 队列长度用标志变量size,它是独立于front和rear的一个变量。size == 0,队列为空。size == capacity,满队列。 一、结点声明 Capacity队列容量;Front,Rear为队列首元素和尾元素的数组下标;Size为当前队列大小; 阅读全文
posted @ 2016-05-12 22:12 Lunais 阅读(3306) 评论(0) 推荐(0)
摘要:一、平衡符号 1、知识点补充: 开放符号指左括号,封闭符号指右括号。 2、特点: 程序中开放符号和封闭符号成对出现; 就近原则,封闭符号与离他最近的开放符号相对应; 3、算法 伪代码: 实现: 二、后缀表达式(不需要括号) 后缀表达式:6 5 2 3 + 8 * + 3 + * 6 5 5 8 * 阅读全文
posted @ 2016-05-06 21:53 Lunais 阅读(387) 评论(0) 推荐(0)
摘要:今天学习了利用数组方式的栈的C++实现,这种方式跟指针实现有很多不一样的地方: 栈的指针实现,栈的创建申请头结点,push需要申请新的结点,pop释放结点,这些结点都放在第一个位置,top时,S->next->data即可。 栈的数组实现,只申请一个结点,该结点的结构体内包含,数组的最大容量、栈顶元 阅读全文
posted @ 2016-05-05 16:52 Lunais 阅读(5055) 评论(0) 推荐(0)
摘要:今天学习了栈的C++实现,跟单链表很像: push相当于单链表在第一个位置插入元素; pop相当于单链表在第一个位置删除元素; 1、空栈检查 2、创建一个空栈 空栈只有头结点,第9行表示若不为空栈则删除除头结点以外的所有结点。 3、清空栈(保留头结点) 4、push操作 5、top操作 6、pop操 阅读全文
posted @ 2016-05-03 22:37 Lunais 阅读(5615) 评论(0) 推荐(0)
摘要:注:学习了数据结构与算法分析后,对链表进行了C++实现,参考博文:http://www.cnblogs.com/tao560532/articles/2199280.html 环境:VS2013 //节点的声明 //链表的创建 //链表的插入 //链表的删除 //链表的输出 //链表的清空 //主函 阅读全文
posted @ 2016-04-28 21:21 Lunais 阅读(13421) 评论(0) 推荐(0)
摘要:一、对分查找 给定一个整数X和A0,A1,A2,...,AN-1,后者已排序,求使得Ai=X的下标i,如果X不在数据中,则返回 i=-1 。 分析:首先数据已经排序,那么取中间元素与X进行比较,若相等则返回下标;若不相等则比较其大小以确定搜索区域。 第二种采用递归方法查找。 二、最大公因数,最小公倍 阅读全文
posted @ 2016-04-11 22:56 Lunais 阅读(427) 评论(0) 推荐(0)
摘要:一、遍历所有可能情况 (1234...N)所有可能子序列如下: 1;12;123...... 2;23;234...... ...... N 共N趟,没趟可能的情况由N,N-1...,1依次递减。 时间复杂度O(N3)的算法: int MaxSubsequenceSum( const int A[ 阅读全文
posted @ 2016-01-18 21:02 Lunais 阅读(285) 评论(0) 推荐(0)