03 2012 档案

摘要:1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 s 遍历文件a,对每个url求取,然后根据所取得的值将url分别存储到1000个小文件(记为)中。这样每个小文件的大约为300M。 s 遍历文件b,采取和a相同的方式将url分别存储到1000各小文件(记为)。这样处理后,所有可能相同的url都在对应的小文件()中,不对应的小文件不可能有相同的url。然后我们只要求出100 阅读全文
posted @ 2012-03-30 22:48 爱也玲珑 阅读(1613) 评论(0) 推荐(0)
摘要:heap和stack的差别 在进行c/c++编程时,需要程序员对内存的了解比较精准。经常需要操作的内存可分为以下几个类别。 栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈。 堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收,存放new、malloc等变量。但是它与数据结构中的堆是两回事,分配方式倒是类似于链表。 全局区(静态区)(static):全局变量和static变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和static变量在相邻的另一块区域。程序... 阅读全文
posted @ 2012-03-28 17:38 爱也玲珑 阅读(501) 评论(0) 推荐(0)
摘要:(一)排序基本概念: 根据排序过程中待排序文件存放的位置不同,可以把排序分为内部和外部排序两大类。在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序;在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序。内部排序适用于记录个数不很多的较小待排序文件的排序;外部排序则适用于记录个数太多不能一次全部放入内存的较大待排序文件的排序。(二)内部排序分类:交换排序:常用的交换排序方法有冒泡排序和快速排序。选择排序:常用的选择排序方法有直接选择排序、树型选择排序和堆排序。插入排序:主要的插入排序方法有直接插入排序、希尔排序、二分法插入排序. 阅读全文
posted @ 2012-03-28 16:14 爱也玲珑 阅读(3229) 评论(0) 推荐(2)
摘要:多设置了一个ans变量,每次找到一个等于val的值,我就用它的序号覆盖ans,这样,由于我们的寻找方向是正确的,因此最后ans记录的序号,肯定就是我们需要的答案,同时,如果不存在,则ans已经初始为-1,因此,最后直接返回ans即可。看下面5个例子。第一,求任意一个i使得num[i]等于val,不存在返回-1;View Code int BinarySearch(int low, int high, int val){ int ans = -1; while(low <= high){ int mid = (low + high) / 2; if... 阅读全文
posted @ 2012-03-27 22:33 爱也玲珑 阅读(642) 评论(0) 推荐(0)
摘要:二叉查找树是满足以下条件的二叉树:1.左子树上的所有节点值均小于根节点值,2右子树上的所有节点值均不小于根节点值,3,左右子树也满足上述两个条件。 二叉查找树的插入过程如下:1.若当前的二叉查找树为空,则插入的元素为根节点,2.若插入的元素值小于根节点值,则将元素插入到左子树中,3.若插入的元素值不小于根节点值,则将元素插入到右子树中。 二叉查找树的删除,分三种情况进行处理: 1.p为叶子节点,直接删除该节点,再修改其父节点的指针(注意分是根节点和不是根节点),如图a。 2.p为单支节点(即只有左子树或右子树)。让p的子树与p的父亲节点相连,删除p即可;(注意分是根节点和不是根节点... 阅读全文
posted @ 2012-03-27 18:00 爱也玲珑 阅读(40544) 评论(5) 推荐(4)
摘要:带权图分为有向和无向,无向图的最短路径又叫做最小生成树,有prime算法和kruskal算法;有向图的最短路径算法有dijkstra算法和floyd算法。 生成树的概念:联通图G的一个子图如果是一棵包含G的所有顶点的树,则该子图称为G的生成树 生成树是联通图的极小连通子图。所谓极小是指:若在树中任意增加一条边,则 将出现一个回路;若去掉一条边,将会使之编程非连通图。生成树各边的权 值总和称为生成素的权。权最小的生成树称为最小生成树,常用的算法有prime算法和kruskal算法。 最短路径问题旨在寻找图中两节点之间的最短路径,常用的算法有:floyd算法和dijkstra算法。 构造... 阅读全文
posted @ 2012-03-26 22:30 爱也玲珑 阅读(57282) 评论(6) 推荐(12)
摘要:并查集:(union-find sets)是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数等。最完美的应用当属:实现Kruskal算法求最小生成树。并查集的精髓:1、make_set(x) 把每一个元素初始化为一个集合初始化后每一个元素的父亲节点是它本身,每一个元素的祖先节点也是它本身(也可以根据情况而变)。2、find_set(x) 查找一个元素所在的集合(有两种方法:朴素查找和采用路径压缩的方法查找,其中路径压缩有递归和非递归)查找一个元素所在的集合,其精髓是找到这个元素所在集合的祖先!这个才是并查集判断和合并的最终依据。判断两个元素是否 阅读全文
posted @ 2012-03-26 19:55 爱也玲珑 阅读(397) 评论(0) 推荐(0)
摘要:#include<iostream>using namespace std;struct node { int num; int val; struct node *next; };struct gpnode{ int data; struct node *link; };//由键盘输入生成图邻接表 struct gpnode *create_Link_GP(int n) //n是图中节点个数 { int seq, v; struct node *p; struct gpnode *gp = (struct gpnode *)mall... 阅读全文
posted @ 2012-03-26 11:21 爱也玲珑 阅读(639) 评论(0) 推荐(0)
摘要:STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们大家使用。下面,我们就浅谈某些常用的容器。这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点。STL中的常用容器包括:顺序性容器(vector、deque、list)、关联容器(map、set)、容器适配器(queue、stac)。1、顺序性容器(1)vector vector是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问。由于具有连续的存储空间,所以在插入和删除操作方面,效率比较慢。vector有多个构造函数,默认的构造函数是构造一个初始长度为0的内存空间,且分配的内存空间是以2. 阅读全文
posted @ 2012-03-26 09:54 爱也玲珑 阅读(401) 评论(0) 推荐(0)
摘要:#include<iostream>using namespace std;#define LEN sizeof(struct node)typedef struct node *pnode;int n; //节点个数struct node{ char val; pnode lchild; pnode rchild; };//生成二叉树 pnode createBinaryTree(){ char ch; scanf("%c", &ch); //421##3##76##8#9## pnode root = (pnode)malloc(LEN);... 阅读全文
posted @ 2012-03-25 17:25 爱也玲珑 阅读(772) 评论(0) 推荐(0)
摘要:Static对函数的作用:当同时编译多个文件,所有未加static前缀的全局变量和函数都具有全局可见性。如果加了static,会对其他文件隐藏,利用static可以在不同的文件定义同名的函数和变量。Static对变量的作用有三个:1.和对函数的作用一样。2.保持变量的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,并且是唯一的一次初始化。存储在静态存储区的变量有两类:全局变量和static变量,和全局变量比起来,static可用控制变量的可见范围,说到底static还是用来隐藏。举例如下:#include<stdio.h>#include<stdlib.h> 阅读全文
posted @ 2012-03-24 19:39 爱也玲珑 阅读(585) 评论(0) 推荐(0)
摘要:(排序数组)题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。、分析:如果我们不考虑时间复杂度,最简单想法是计算任一一个数字与其他n-1个数字的和,判断是否等于给定值。复杂度是O(n2)。由于该序列是升序数组,我们假设随意取数组中的两个数,如果和等于给定值,那么就是我们所找的两个数;如果小于给定值,很容易想到,更小的那个数应该更大,即下标应该更大,那么对应的数会更大;如果大于给定 阅读全文
posted @ 2012-03-24 16:39 爱也玲珑 阅读(3334) 评论(0) 推荐(0)
摘要:穷举的模式匹配算法时间代价:最坏情况比较n-m+1趟,每趟比较m次,总比较次数达(n-m+1)*m。复杂度为O(m*n)。原因在于每趟重新比较时,目标串的检测指针要回退,而这回退后再进行的计算很多是没必要。改进的模式匹配算法(KMP算法)可使目标串的检测指针不回退。总的比较次数最坏为n,求next函数的比较次数为m,所以总的时间复杂度为O(n+m)。 假设S串匹配到i位置,T串匹配到j位置,那么穷举法和KMP算法的区别就在于失配情况下所做的处理。我们的字符串下标从0开始。穷举法中,如果当前字符匹配,即S[i]=T[j],则令i++, j++,继续匹配下一个字符;如果失配,即S[i]!=T... 阅读全文
posted @ 2012-03-24 00:54 爱也玲珑 阅读(651) 评论(0) 推荐(0)
摘要:回溯法解决八皇后问题回溯发的步骤: 从第一行开始进行,设前i-1行上的皇后已经布局好,互不攻击。现考虑第i行上的皇后的位置, 使之与前i-1行上的皇后也都互不攻击。 (1)检查第i行上的皇后与前i-1行的皇后是否互不攻击。若有攻击,则将第i行上的皇后右移一个位置, 重新进行这个过程;若无攻击,则考虑安排下一行上的皇后位置。 (2)若安排好的皇后是最后一行,则说明已经找到了8个皇后互不攻击的一个布局,将这个布局输出, 然后将该行上的皇后右移一个位置,重新进行这个过程,以便寻找下一个布局。View Code #include<iostream>using namespace std;i 阅读全文
posted @ 2012-03-22 16:44 爱也玲珑 阅读(935) 评论(0) 推荐(0)
摘要:所有变量在内存中的存储都有对齐问题,包括结构体和类(对象)等,只是这些对程序员是透明的,不需要关心。说白了,对齐就是在空间与复杂度上达到平衡,在可接受的空间浪费前提下,尽可能提高相同运算过程的速度。 举个例子,现在有两个变量:char A; int B; 在不考虑对齐时,A变量从内存地址0开始分配,占0x00内存,B变量占0x01-0x04。一般情况下,地址总线总是按照对齐后的地址来访问的。计算机的处理过程是先将0x00-0x03共32位读入寄存器,与0x000000FF做与运算或者通过左移24位再右移24位得到A的值。获得B变量的方法是将0x00-0x03这32位读入寄存器,得到低24... 阅读全文
posted @ 2012-03-20 15:26 爱也玲珑 阅读(744) 评论(0) 推荐(0)