博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

随笔分类 -  算法

摘要:我们从浅入深一步一步介绍什么是分布式哈希表。 1、哈希函数 哈希函数是一种计算方法,它可以把一个值A映射到一个特定的范围[begin, end]之内。对于一个值的集合{k1, k2, … , kN},哈希函数把他们均匀的映射到某个范围之中。这样,通过这些值就可以很快的找到与之对应的映射地址{index1, index2, … , indexN}。对于同一个值,哈希函数要能保证对这个值的运算结果... 阅读全文

posted @ 2011-11-26 16:42 天地玄黄 阅读(8089) 评论(0) 推荐(0)

摘要:数组a[N]1、使用i,j作为下标一次对比数组中的两个数。2、用最简单的方法找出数组中的最大最小数,时间为O(n)。然后建立一个binary array,用0代表某个数没有在数组a中,1代表在数组a中。这样就可以找到两个相同的数。时间为O(n)3、对数组排序,然后依次查看每个两个相邻的数即可。排序时间复杂度最小为O(nlogn)。总共时间为o(nlogn+n)。 阅读全文

posted @ 2011-10-24 16:39 天地玄黄 阅读(4504) 评论(0) 推荐(0)

摘要:算法 BreadthFirstSearch(v) // 以序号为v的顶点出发,广度优先遍历图BFS1 [创建一个辅助队列] CREATE(Q). BFS2 [开始节点入队] Q <= v. BFS3 [创建辅助数组,记录哪些节点已经被访问] visited[]. BFS4 [初始化辅助数组] FOR i FROM 0 TO graphsize DO ... 阅读全文

posted @ 2011-10-12 17:09 天地玄黄 阅读(344) 评论(0) 推荐(0)

摘要:算法 DepthFirstSearch(v, visited[]) // 以序号为v的顶点出发,深度优先遍历图 // visited[] 是一个辅助数组,用来记录哪些节点已经被访问DFS1 [打印当前节点] PRINT(v). visited[v] <- 1. DFS2 [获取当前节点的第一个相邻节点] w <- GetFirstNeighbor(v). ... 阅读全文

posted @ 2011-10-12 17:07 天地玄黄 阅读(273) 评论(0) 推荐(0)

摘要:一个数组,查找这个数组中最大的一个连续子数组。比如{1, 2, 3, –11},这个数组中最大子数组为{1, 2, 3}。 算法复杂度: O(nlgn) 伪代码: C代码: #include <stdio.h>typedef struct index { int left; int right; int sum;} index_t;index_t find_max_cros... 阅读全文

posted @ 2011-09-02 11:27 天地玄黄 阅读(2323) 评论(0) 推荐(1)

摘要:把整个矩阵按sqrt(n)为一块,分成n/sqrt(n)块,在查询的时候就按照小块进行分割。边缘部分按照顺时针分成相同的小条。 代码如下: /*The solution of RMQ using a <O(n), O(sqrt(n))> algrithom *http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonA... 阅读全文

posted @ 2011-03-09 14:19 天地玄黄 阅读(313) 评论(0) 推荐(0)

摘要:预处理时间复杂度为 O(NlogN),查找时间复杂度为 O(1) /*The RMQ question, using Sparse Table(ST) algorithm to solve it *http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor * *initRMQ: M[N][logN][... 阅读全文

posted @ 2011-03-08 20:48 天地玄黄 阅读(467) 评论(0) 推荐(0)

摘要:深度优先搜索用栈(stack)来实现,整个过程可以想象成一个倒立的树形: 1、把根节点压入栈中。 2、每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱。 3、找到所要找的元素时结束程序。 4、如果遍历整个树还没有找到,结束程序。 广度优先搜索使用队列(queue)来实现,整个过程也可以看做一个倒立的树形: 1、把根节点放到队列的末尾。 2、... 阅读全文

posted @ 2011-01-10 16:49 天地玄黄 阅读(369) 评论(1) 推荐(0)

摘要:快速排序: 其思想为:在一个序列中,我们指定一个数(比如a[0]),然后查看整个数列,让比a[0]小的数都放到a[0]之前,比a[0]大的数都放到a[0]之后,那么a[0]所在的位置就是排好序后它应该待的位置。然后我们再对这个处理过的数列的前半部分用快速排序的方法排序,对后半部分用快速排序的算法进行排序,这样整个数列就排好序了。 Base Case:如果被a[0]分成的两部分只有一个元素或者没有元... 阅读全文

posted @ 2011-01-10 15:01 天地玄黄 阅读(2937) 评论(1) 推荐(1)

摘要:插入排序: 时间复杂度为Θ(n2) 阅读全文

posted @ 2011-01-09 16:57 天地玄黄 阅读(643) 评论(0) 推荐(0)

摘要:在Linux下实现了一个归并排序的算法,分成多个文件,这里记录三点:归并排序的算法、makefile的使用、gdb调试心得 一、归并排序算法 算法的递推关系:一个大的数列需要排序,把它从中间分成两部分,每一部分归并排序,然后把排好序的这两个部分再合并起来(合并的时候要按顺序合并)。 算法的Base Case:如果分成的这部分只有一个数,那么这个部分就不用再排序(看做已经排好序的)。 实现这个算法用了三个函数,每个函数在一个文件中,分别为:merge.c sort.c 和 main.c,其中merge.c实现的是合并的方法,sort.c实现的是排序的方法,main.c是一个测试实例。还有三 阅读全文

posted @ 2011-01-08 22:04 天地玄黄 阅读(17347) 评论(0) 推荐(0)

摘要:这是我自己写的一个插入排序的算法,main函数是测试用的,insertion_sort()函数就是插入排序的算法: 看了一下网上的源码,又有了一些改进,让代码更加紧凑。不过算法还是不是很明晰,看来需要专门学习一下算法了。 阅读全文

posted @ 2011-01-07 14:21 天地玄黄 阅读(446) 评论(0) 推荐(0)