摘要:
数据规模分析不考虑操作系统的区别,通常将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 阅读全文