算法数据结构
zlingh
大家多多交流我邮箱是[email protected]
展开
-
编程时该考虑到的特殊情况
空指针NULL,空字符串"",正负号,溢出变量初始化的顺序是按照声明顺序而不是按照初始化列表中的顺序求链表倒数第k个节点,用两个指针,且这两个指针之间相差k,那么前一个到达末尾时,后一个恰好是倒数第k个原创 2012-11-07 22:24:34 · 455 阅读 · 0 评论 -
算法,求从小到大排序的1500个丑数
丑数:只包含因子2,3,5的数称为丑数解这个题的方法,生成法,滚雪球一样,越滚越大,假设我们已经有n个最小的丑数集合S,且已经从小到大排好序,下面我们要找下一个丑数,这个丑数必定是2,3,5与集合S的乘积中大于Smax且是最小的。所以我们可以首先用2乘以集合S,找到大于Smax的最小的数T2,再重复找到T3,T5。取T2,T3,T5的最小值。注:其实我们可以达到o(n)的时间计算复杂度,这还原创 2012-11-07 22:24:57 · 756 阅读 · 0 评论 -
堆排序
void dealHeap(int *p, int index, int count){ if (2*index + 2 > count) return ; int left = 2*index + 1; int right = 2*index + 2; int m = p[left] > p[right] ? left : right;转载 2012-12-16 23:32:39 · 359 阅读 · 0 评论 -
二分图最大权匹配-km算法
百度百科是错的,关于相等子图的那一块。穷举的效率-n!,我们需要更加优秀的算法。定理:设M是一个带权完全二分图G的一个完备匹配,给每个顶点一个可行顶标(第i个x顶点的可行标用lx[i]表示,第j个y顶点的可行标用ly[j]表示),如果对所有的边(i,j) in G,都有lx[i]+ly[j]>=w[i,j]成立(w[i,j]表示边的权),且对所有的边(i,j) in M,都有l原创 2013-10-02 23:16:42 · 2361 阅读 · 0 评论 -
谷歌一面试题
http://kb.cnblogs.com/page/150578/ 英文原文:AGoogle Interviewing Story 很多年前我进入硅谷人才市场,当时是想找一份高级工程师的职位。如果你有一段时间没有面试过,根据经验,有个非常有用的提醒你应该接受,就是:你往往会在前几次面试中的什么地方犯一些错误。简单而言就是,不要首先去你梦想的公司里面试。面试中有多如牛毛的应该原创 2012-11-07 22:21:18 · 443 阅读 · 0 评论 -
求数组中第k小的数,或者最小的k个数
一:利用快速排序的思想,可以在O(n)的时间复杂度下解决问题,为什么是O(n)呢,它是这么相加的n+n/2+n/4+n/8+...=2n所以是O(n),这种方法会改变原数组的顺序。二:另外还有一种nlong(k),特别适合处理海量数据首先创建一个k大小的容器,这个容器建议使用二叉树,或者最大堆来实现,每次查找容器中最大数,删除最大数,插入新数。操作需要log(k)的时间。所以总的时原创 2012-12-07 20:58:39 · 1395 阅读 · 0 评论 -
三进制与一道经典的砝码问题
有4个砝码a,b,c,d重量分别是1,3,9,27,问这几个砝码可以称重多少种可能的重量?若把放左边设为-1,不放设为0,放右边设为1,则每个砝码都有3种放法,所有总共有3^4=81中放法,穷举法是把这81中放法的值都求出来,再取绝对值,去掉重复的,看下有多少个数,这个数量就是我们可以称重的可能数了。然而观察发现a,b,c,d是个3的等比数列,那么我们就可以把这个问题对应到原创 2012-11-08 19:24:48 · 2052 阅读 · 0 评论 -
优先队列用法
在优先队列中,优先级高的元素先出队列。标准库默认使用元素类型的优先队列的第一种用法,也是最常用的用法:priority_queueint> qi;通过故示例1中输出结果为:9 6 5 3 2第二种方法:在示例1中,如果我们要把元素从小到大输出怎么办呢?这时我们可以传入一个比较函数,使用functional.h函数对象作为比较函数。priority转载 2013-11-17 21:04:25 · 599 阅读 · 0 评论 -
红黑树
http://dongxicheng.org/structure/red-black-tree/1. 简介红黑树是一种自平衡二叉查找树。它的统计性能要好于平衡二叉树(AVL树),因此,红黑树在很多地方都有应用。在C++STL中,很多部分(目前包括set, multiset, map, multimap)应用了红黑树的变体(SGISTL中的红黑树有一些变化,这些修改提供了更好的性能,原创 2012-11-07 22:20:37 · 356 阅读 · 0 评论 -
二叉排序树删除节点的几种方法
二叉排序树删除节点的几种方法1:删除节点左子树的最右边的元素替代之,相当于用前继节点替代2:删除节点右子树的最左边的元素替代之,相当于用后继节点替代以上两种都不改变中序遍历二叉树所得的顺序3:设要删除的节点是B,节点B是节点A的左子树。删除节点B以后,令B的左子树为A的左子树,B的右子树加到B的左子树的最右边。4:http://www.cppblog.com/guogangj/a原创 2012-11-07 22:20:34 · 4837 阅读 · 0 评论 -
移位运算解决问题的例子
巧用(n-1)&n 可以让n二进制最低位的1变成01:判断一个数是否是2的次方bool f(int n){ return ((n-1)&n==0);}如果一个数是2的次方,那么这个数的二进制中就只有一个1。(n-1)&n可以让n二进制最低位的1变成0,如果n二进制只有一个1那么n做该种运算后就会变成0。2:求一个数二进制中1的位数int f(int n){int count=原创 2012-11-07 22:21:26 · 616 阅读 · 0 评论 -
C语言简单实现sizeof功能代码
sizeof不是函数,而是运算符,C/C++语言编译器在预编译阶段的时候就已经处理完了sizeof的问题,也就是说sizeof类似于宏定义。下面给出一个sizeof的一个宏定义实现版本#define sizeof(L_Value) ((char*)(&L_Value + 1) - (char*)(&L_Value))实验一:#define mysizeof(L_Value) (原创 2013-11-17 18:28:39 · 3660 阅读 · 0 评论 -
B树等
http://www.cnblogs.com/oldhorse/archive/2009/11/16/1604009.htmlhttp://m.oschina.net/blog/32249B数即 二叉搜索树,不是平衡二叉树B-树 是一种多路搜索树(并不是二叉的):所以B-树的性能总是等价于二分查找(与M值无关)o(lgN),也就没有B树平衡的问题;原创 2012-11-07 22:24:53 · 420 阅读 · 0 评论 -
读论文《Probabilistic Data Structures for Web Analytics and Data Mining》笔记
Zipfian distribution:遵循zipf law分布的数据zipf law :在给定的语料中,对于任意一个term,其频度(freq)的排名(rank)的乘积大致是一个常数。Zipf应用 相信你一定听过这样的说法: 80%的财富集中在20%的人手中…… 80%的用户只使用20%的功能…… 20%的用户贡献了80%的访原创 2013-01-02 23:15:30 · 1444 阅读 · 0 评论 -
O(n)求最长回文子串
其实原文说得是比较清楚的,只是英文的,我这里写一份中文的吧。 首先:大家都知道什么叫回文串吧,这个算法要解决的就是一个字符串中最长的回文子串有多长。这个算法可以在O(n)的时间复杂度内既线性时间复杂度的情况下,求出以每个字符为中心的最长回文有多长, 这个算法有一个很巧妙的地方,它把奇数的回文串和偶数的回文串统一起来考虑了。这一点一直是在做回文串问题中时比较烦的地方。这个算法还有转载 2013-11-04 17:22:52 · 662 阅读 · 0 评论 -
杂
iostream和iostream.h区别更本质上的区别就是iostream把标准C++库的组件放在一个名位std的namespace里面。而相对的iostream.h则将这些标准组件放在全局空间里,同时在标准化以后旧有的C标准库也已经经过改造了。使用前者,就需要在代码中添加语句:using namespace std;由于扑克牌的值出现在0~13之间,我们可以定义一个长度为14的哈希表,原创 2012-11-07 22:24:55 · 346 阅读 · 0 评论 -
前序,中序,后序遍历的非递归
中序:书上有前序:先把根节点r入栈,然后出栈并visit,然后把出栈的这个节点的左右子节点入栈,然后出栈设为p并visit,此时若p的右节点为null则不入栈,否则入栈,然后判断左节点,不为空则入栈。然后出栈,重复即可。其实是这样一个从根节点一直往下,同时把右节点入栈记住,当左边访问完,再把右节点退栈访问。的这么一个过程。后序遍历:《优先左进到底,无左节点了再往右;接下来再重复。把这路径上原创 2012-11-07 22:24:47 · 372 阅读 · 0 评论 -
剑指offer,求一个递增数组,是否…
用两个指针,一个指向结尾,一个指向开头,判断他们之和与我们想要的大小关系,若太大了,则把首指针往后移,若太小,则把末尾指针往前移动。若题目改为要把所有这样的数对找出来,也是一样的道理,只不过找到一个后,指针要继续往中间移动,知道连个指针重合。很多算法,都是用两个指针,要么是两个往中间移动,要么是都往一边移动,保持一个间隔。往两边移动的好像没有。异或也叫半加运算,其运算法则相当于不带进位原创 2012-11-07 22:24:45 · 435 阅读 · 0 评论 -
剑指offer,求一个数组中出现一次…
这个解法用到了位运算,如果已知数组中其他数都出现两次,只有一个数出现一次,那么我们把所有数进行或加运算就可以得到了。还有个题目是求数组中第一次出现一个的数,好像是利用哈希表,用数组建立一个简单的哈希表。原创 2012-11-07 22:24:49 · 413 阅读 · 0 评论 -
当我们知道我们要处理的数的范围的…
比如哈希技术就是这样两个指针相等就是说,这两个指针的地址和所指向的类型都一样。原创 2012-11-07 22:24:51 · 366 阅读 · 0 评论 -
对于整数,求子问题
对于一个整数n(abcd),他的子问题可以是n-1,或者bcd,把高位去掉。算法都是求n规模的解,直接可能得不到n规模的解1:但是如果我们可以找到n规模和n-1规模的关系,或者说f(n)和f(n-1)和f(n-2)的关系也即找到f(n)=g(f(n-1)),而且对于n=1的规模的解我们又很容易得到的话我们就可以使用动态规划。最优子结构性质:当问题的最优解包含了其子问题的最优解时,我们原创 2012-11-07 22:24:59 · 425 阅读 · 0 评论 -
字符串和整数互转
字符串转整数http://www.cnblogs.com/processakai/archive/2011/06/24/2089348.htmlhttp://www.cppblog.com/prayer/archive/2010/09/06/126014.htmlatoiisspace(int x){ if(x==''||x=='\t'||x=='\n'||x=='\f'||原创 2012-11-07 22:25:01 · 435 阅读 · 0 评论 -
关于qsort使用
qsort 的函数原型是void __cdecl qsort ( void *base, size_t num, size_twidth, int (__cdecl *comp)(const void *, const void* )) 其中base是排序的一个集合数组,num是这个数组元素的个数,width是一个元素的大小,comp是一个比较函数。注意qsort调用comp的方法原创 2012-11-07 22:25:06 · 350 阅读 · 0 评论 -
Kahan‘s Summation Formula原理—它是如何避免大数吃小数的
Kahan求和公式原理: 首先,这个算法就是用来求和的,求a1+a2+a3+...为什么不直接相加呢,而要用Kahan求和公式呢,这个算法的用武之地在哪呢,一一道来 kahan求和算法能避免大数吃小数的情况。 大数吃小数是什么意思呢?举个例子,我们用两个float相加,float是32位,它的精度是小数点后6-7位(详见http://blog.csd原创 2012-11-18 23:26:35 · 10321 阅读 · 0 评论 -
模糊C均值聚类算法及实现
FCMhttp://wenku.baidu.com/view/ee968c00eff9aef8941e06a2.htmlmean-shifthttp://wenku.baidu.com/view/0d9eb876a417866fb84a8eb2.html原创 2013-04-07 16:27:26 · 7154 阅读 · 0 评论 -
排序
归并排序快速排序原创 2013-09-18 11:17:49 · 510 阅读 · 0 评论 -
trie树(字典树)
Trie的简单实现(插入、查询)Trie,又称字典树、单词查找树,是一种树形结构,用于保存大量的字符串。它的优点是:利用字符串的公共前缀来节约存储空间。 1 2#include iostream> 3using namespace std; 4 5const int branchNum = 26; //声明常量 6int i; 7 8struct Trie_node 9{10 bool isStr; //记录此处是否构成一个串。11 Tr原创 2013-10-29 14:56:37 · 766 阅读 · 0 评论 -
哈希树
我们选择质数分辨算法来建立一棵哈希树。选择从2开始的连续质数来建立一个十层的哈希树。第一层结点为根结点,根结点下有2个结点;第二层的每个结点下有3个结点;依此类推,即每层结点的子节点数目为连续的质数。到第十层,每个结点下有29个结点。如下图所示:同一结点中的子结点,从左到右代表不同的余数结果。例如:第二层结点下有三个子节点。那么从左到右分别代表:除3余0,除3余1,除3转载 2013-10-29 14:59:40 · 1007 阅读 · 0 评论 -
Bit-Map算法
BitMap的定义:所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。 使用bitmap实现8位电话号码的存储,能够实现电话号码的插入、删除、查找。使用bitmap算法。8位电话号码总共有0-99999999个号码,每位代表一个电话号码,需要12500000原创 2013-11-01 19:13:34 · 615 阅读 · 0 评论 -
堆排序
代码一:对数组a,使用堆进行排序,建立堆和排序输出都在数组a上,代码挺经典,不用递归#include "stdafx.h" #includeusing namespace std;void adjustHeap(int a[],int index,int length)//从把节点index和index*2与index*2+1调整为最大堆,并且把后面产生的影响消除。一句话就是把i原创 2013-11-07 22:22:13 · 508 阅读 · 0 评论 -
最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
最大子序列最大子序列是要找出由数组成的一维数组中和最大的连续子序列。比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大;而 {5,-6,4,2}的最大子序列是{4,2},它的和是6。你已经看出来了,找最大子序列的方法很简单,只要前i项的和还没有小于0那么子序列就一直向后扩展,否则丢弃之前的子序列开始新的子序列,同时我们要记下各个子序列的和,最后找到和最大的转载 2014-01-20 12:55:54 · 808 阅读 · 0 评论 -
Java中的CopyOnWrite容器
感谢 清英 同学的投稿Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyO转载 2014-06-11 21:05:04 · 581 阅读 · 0 评论