
算法与数据结构
Dave888Zhou
大处着眼,小处着手;群居守口,独居守心。
展开
-
排序算法的实现
1、直接插入排序:把后面未排序部分的首个数插入到前面已排序部分的正确位置上去,直到全部排好顺序。直接插入排序是稳定的,算法时间复杂度O(n^2)。/* 直接插入排序 */void insert_sort(int v[],int n){ register int i,j,temp; for(i=1; i<n; ++i){ /* 0~i-1为已排序部分,i~n-1为未排序部分原创 2009-09-23 23:08:00 · 1688 阅读 · 2 评论 -
贪心算法
1、活动安排问题:设有n个活动E={1,2,...,n},其中每个活动都要求使用同一资源(如演讲会场等),且在同一时间内只有一个活动能使用这一资源。如果选择了执行活动i,则它在半开的时间区间[s[i],f[i])内占用资源,其中s[i]=f[j]或s[j]>=f[i],则称活动i与活动j是相容的。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集A。原创 2010-08-08 21:44:00 · 2564 阅读 · 1 评论 -
程序时间空间开销测试
1、空间开销测试:下面的程序测试各种C++结构及其分配内存的空间开销。原创 2010-06-15 22:59:00 · 3626 阅读 · 0 评论 -
回溯法
1、0-1背包问题:给定n种物品,价值分别为v[1],v[2],...,v[n],重量分别为w[1],w[2],...,w[n]。有一个背包其载重容量为c,问应如何选择装入背包中的物品,使得装入背包中的物品的总价值最大。这里每种物品只能装入一次或者不装入背包。这是一个特殊的整数线性规划问题,即在w[1]x[1]+w[2]x[2]+...+w[n]x[n]原创 2010-08-21 23:15:00 · 14362 阅读 · 4 评论 -
分支限界法
1、单源最短路径问题:给定一个带权有向图G=(V,E),其中每条边的权是一个非负实数,V={1,2,...,n}。设顶点v作为源顶点。要计算从源到所有其他各顶点的最短路径长度。原创 2010-08-26 20:35:00 · 8501 阅读 · 1 评论 -
数值概率算法
1、随机数生成:产生伪随机数最常用的方法是线性同余法。由线性同余法产生的均匀随机序列a[1],a[2],...,a[n],...满足 a[0]=d, a[n]=(b*a[n-1]+c) mod m, n=1,2,...,其中b>=0,c>=0,d>=m。d称为该随机序列的种子。如何选取常数b,c和m直接关系到所产生的随机序列的随机性能。这是随机性理论重点研究的内容。从直观上看,m应该取得充分大。另外应取gcm(m,b)=1,因此可取b为一素数。原创 2010-08-26 20:48:00 · 6765 阅读 · 1 评论 -
并查集
1、概述 在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题的特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在很短的运行时间(如1~3秒)内计算出需转载 2013-05-05 22:27:10 · 1701 阅读 · 0 评论 -
判断单链表是否存在环以及两个链表是否相交
有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。如下图:图1 有环的链表 问题:如何判断一个链表是不是这类链表?如果链表为存在环,如何找到环的入口点? 1、判断链表是否存在环 思想:设两个指针向前遍历,一个速度慢,一个速度快,若存在环,速度快的一定能追上速度慢的。 设置两个指针f转载 2013-05-05 22:35:06 · 1920 阅读 · 1 评论 -
微软经典面试100题系列(部分)
本文整理自:http://blog.youkuaiyun.com/v_july_v/article/details/6543438 1. 把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该转换成个排 序的双向链表。要求不能创建任何新的结点,只调整指针向。 10/ \6 14/ \ / \4 8 12 1翻译 2014-07-10 14:29:04 · 28946 阅读 · 1 评论 -
字符串结构
字符串是一种最基本的数据结构。 问题1(单词级别):对文档中每个单词出现次数进行统计。例如圣经中大约有29131个不同的单词,统计其出现次数。原创 2010-06-13 21:27:00 · 1979 阅读 · 0 评论 -
堆结构的运用
堆通常用来表示元素集合。小根堆的任何父结点的值都小于或等于其子结点的值。最底层的叶结点尽可能地靠左分布,树中不存在空闲的位置。堆可以用二叉树或一维数组来表示。用数组x[1...n]表示时,value(i)=x[i], leftchild(i)=2*i, rightchild(i)=2*i+1, parent(i)=i/2,根为x[1]。我们可能把堆定义为heap(t,u),对任意的2t原创 2010-06-13 21:17:00 · 3282 阅读 · 0 评论 -
递归与分治策略
1、全排列问题:设R(n)={r[1],r[2],…,r[n]}是要进行排列的n个元素。集合X中元素的全排列记为Perm(X)。求R(n)的全排列Perm(R(n))。 用递归算法求解:原创 2010-07-25 22:00:00 · 8069 阅读 · 1 评论 -
位图数据结构的运用
海量数据排序问题:文件包含1千万条电话号码记录(10**7次方),每条记录都是7位整数,没有重复的整数。要求对文件进行排序,注意大约只有1MB的内存空间可用,有充足的磁盘存储空间可用。请设计一个高效的算法。 (1)运用多趟算法:如果每个号码都使用32位整数来表示,则在1MB存储空间里大约可以存250000个号码。因此,可以使用遍历输入文件40趟的程序来完成排序。在第一趟中,将0至2499原创 2010-05-30 23:13:00 · 5050 阅读 · 2 评论 -
变位词问题
变位词问题:给定一个英语字典,找出其中的所有变位词集合,例如,"pots","stop"和"tops"互为变位词,因为每一个单词都可以通过改变其他单词中字母的顺序来得到。原创 2010-06-01 21:19:00 · 4689 阅读 · 2 评论 -
程序性能优化
设计层面的性能优化: 1、问题定义:良好的问题定义可以避免用户对问题需求的过高估计。问题定义和程序效率之间具有复杂的相互影响。原创 2010-06-05 21:36:00 · 1389 阅读 · 0 评论 -
动态规划
1、矩阵连乘问题:两个矩阵相乘的标准算法如下:原创 2010-08-01 18:22:00 · 1909 阅读 · 0 评论 -
最大子序列问题
问题1:输入是具有n个浮点数的向量x,输出这个向量的任何连续子向量中的最大和。当所有元素为负数时定义最大和为0。原创 2010-06-05 21:51:00 · 1643 阅读 · 0 评论 -
概率取样问题
问题:程序输入两个整数m和n,其中m原创 2010-06-07 18:53:00 · 1959 阅读 · 0 评论 -
整数集合的实现
问题:很多应用都需要搜索一组数据,比如编译器查找变量名以得到其地址,拼写检查器查找字典,DNS查找域名来获得IP地址。这与如何存储这些数据紧密相关。比如存储一组整数,如果用集合来存储,如何实现整数集合?原创 2010-06-07 19:08:00 · 1183 阅读 · 0 评论 -
海量数据处理面试题整理
本文整理自July的博客:http://blog.youkuaiyun.com/v_JULY_v 1、海量日志数据,提取出某日访问百度次数最多的那个IP。 首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用ha转载 2014-07-10 14:19:27 · 3951 阅读 · 0 评论