摘要:
阅读全文
摘要:
前言 之前对kmp算法虽然了解它的原理,即求出P0···Pi的最大相同前后缀长度k;但是问题在于如何求出这个最大前后缀长度呢?我觉得网上很多帖子都说的不是很清楚,总感觉没有把那层纸戳破,后来翻看算法导论,32章 字符串匹配虽然讲到了对前后缀计算的正确性,但是大量的推理证明不大好理解,没有与程序结合起来讲。今天我在这里讲一讲我的一些理解,希望大家多多指教,如果有不清楚的或错误的请给我留言。 1.kmp算法的原理: 本部分内容转自:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93P 阅读全文
摘要:
想提高生产率吗?你找到了合适的文章。我不敢说是生产率专家(我总觉得还有完善的空间),但我非常关注提高生产率。我一直在寻找不同的方式变得更有效率——从哪里我可以偷走时间,忽略不重要的事,获取系统的检修等等。当我看到我付出的努力在一天当中的最后时间取得了成功,增加了产量,我很高兴。在这篇文章中,我选取了13种最好的生产率战略——尝试,测试和验证。如果按照每一种操作,我可以向你保证,你的生产率将会比现在增加一倍或两倍,甚至更多。我自己每天按照下列步骤操作。我不这样做的那段日子,我的生产率骤降。我这样做的日子,我的生产率大增。相关性是显而易见的。为了让你进一步阅读,在有些步骤中我也编写了一系列参考书目 阅读全文
摘要:
数据规模分析不考虑操作系统的区别,通常将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 阅读全文
摘要:
问题:在一个规模为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 阅读全文
摘要:
普通的方法很简单,首先遍历一遍单链表以确定单链表的长度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的移 阅读全文
摘要:
有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。问题:1、如何判断一个链表是不是这类链表?2、如果链表为存在环,如果找到环的入口点?一、判断链表是否存在环,办法为:设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定 相遇。(当然,fast先行头到尾部为NULL,则为无环链表)程序如下:Cpp代码boolIsExitsLoop(slist*head){slist*slow=head,*fast=head;while 阅读全文
摘要:
实现C/C++中的字符串操作函数是很练内功的,别看着这些函数很简单,自己实现起来,还是有许多地方需要考虑的,所以没独立写过的朋友,可以自己敲敲看 .--By Crazybabystrcpy:[cpp]view plaincopyprint?char*cb_strcpy(char*dst,constchar*src){assert((dst!=NULL)&&(src!=NULL));char*retAddr=dst;/**<retAddrisinstatic,charretAddr[]willinStack,So...*/while((*(dst++)=*(src++))! 阅读全文
摘要:
端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile Endian(这句话最为形象)。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。在计算机业Big Endian和Little Endian也几乎引起一场战争。在计算机业界,Endian表示数据在存储器中的存放顺序。下文举例说明在计算机中大小端模式的区别。如果将一个32位的整数0x12345678存放到一 阅读全文
摘要:
示范程序seg7_test.v?12345678910111213141516171819202122/** seg7 x 8 查找表测试文件*/module seg7_test(input CLOCK_50,output [7:0] SEG7_DIG,output [7:0] SEG7_SEG);seg7_8_LUT u0(.i_clock(CLOCK_50),.i_turn_off(8'b1100_0000), // 熄灭位[此处取第7、6位.i_dp(8'b0000_0100), // 小数点位[此处取第2位.i_data(32'hAB_CDEF), // 欲显数 阅读全文