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

摘要:前言 之前对kmp算法虽然了解它的原理,即求出P0···Pi的最大相同前后缀长度k;但是问题在于如何求出这个最大前后缀长度呢?我觉得网上很多帖子都说的不是很清楚,总感觉没有把那层纸戳破,后来翻看算法导论,32章 字符串匹配虽然讲到了对前后缀计算的正确性,但是大量的推理证明不大好理解,没有与程序结合起来讲。今天我在这里讲一讲我的一些理解,希望大家多多指教,如果有不清楚的或错误的请给我留言。 1.kmp算法的原理: 本部分内容转自:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93P 阅读全文
posted @ 2013-07-30 19:41 c_cloud 阅读(167385) 评论(61) 推荐(60) 编辑
摘要:数据规模分析不考虑操作系统的区别,通常将C++中的一个整型变量认为4bytes。那么1亿整型需要400M左右的内存空间。当然,就现代PC机而言,连续开辟400M的内存空间还是可行的。因此,下面的讨论只考虑在内存中的情况。为了讨论方便,假设M=1亿,N=1万。用大拇指想想略微考虑一下,使用选择排序。循环1万次,每次选择最大的元素。源代码如下:Cpp代码//解决方案1,简单选择排序//BigArr[]存放1亿的总数据、ResArr[]存放1万的总数据voidsolution_1(intBigArr[],intResArr[]){for(inti=0;i<RES_ARR_SIZE;++i){i 阅读全文
posted @ 2013-04-19 23:36 c_cloud 阅读(877) 评论(0) 推荐(0) 编辑
摘要:问题:在一个规模为N的数组array[N]中,所谓主元素就是出现次数大于N/2的元素,例如3.3.4.2.4.4.2.4.4 有一个主元素为4。给出一个算法,如果过半元素存在,就找出来,否则给出报告,要求给出O(N)的算法。常规想法(1) 穷举:找出元素中每一个数在数据中的数量。时间复杂度O(N^2)(2) 排序:先对数组快排,然后重头开始遍历一遍计算每个数的数量。时间复杂度O(N*logN+N)经典算法 裁剪数组算法,时间复杂度为O(2N)思想: 如果一个数组array[N],其中有两个元素e1和e2。(1) e1不等于e2假如e1是数组array[N]的主元素,e2不是。那么e1在arra 阅读全文
posted @ 2013-04-19 23:21 c_cloud 阅读(1199) 评论(0) 推荐(0) 编辑
摘要:普通的方法很简单,首先遍历一遍单链表以确定单链表的长度L。然后再次从头节点出发循环L/2次找到单链表的中间节点。算法复杂度为O(L+L/2)=O(3L/2)。能否再优化一下这个时间复杂度呢?有一个很巧妙的方法:设置两个指针* fast、*slow都指向单链表的头节点。其中* fast的移动速度是* slow的2倍。当* fast指向末尾节点的时候,slow正好就在中间了。C源代码如下:Java代码voidlocate(LinkedList*head){LinkedList*fast,*slow;fast=slow=head;while(fast->next!=NULL){//fast的移 阅读全文
posted @ 2013-04-19 22:40 c_cloud 阅读(372) 评论(0) 推荐(0) 编辑
摘要:有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。问题:1、如何判断一个链表是不是这类链表?2、如果链表为存在环,如果找到环的入口点?一、判断链表是否存在环,办法为:设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定 相遇。(当然,fast先行头到尾部为NULL,则为无环链表)程序如下:Cpp代码boolIsExitsLoop(slist*head){slist*slow=head,*fast=head;while 阅读全文
posted @ 2013-04-19 22:39 c_cloud 阅读(394) 评论(0) 推荐(0) 编辑