
Data Structure
文章平均质量分 76
JUAN425
这个作者很懒,什么都没留下…
展开
-
海量数据找缺失的值
一个文件中含有4billion的integers, 试图找出一个不再这个文件中的数。假如一个integer用4bytes表示,那么文件的大小就是4 * 10 ^9 * 4 = 16 GB。 文件太大了。 (1)办法一: 采用外排序的办法。对这些数据排完序之后, 可以从第一个数开始遍历, 知道出现gap, 表示gap之间缺少一个元素。这样我们输出的是第一个missing的value。(2原创 2015-04-16 20:13:14 · 984 阅读 · 0 评论 -
Hash Table Lab
Part 1For the following two questions, use the following values: 67 46 88 91 123 141 152 155 178 288 390 399 465 572 621 734Draw a diagram to show how the values are inserted into a hash ta转载 2014-08-12 21:14:22 · 1939 阅读 · 0 评论 -
LCS 问题的解决办法
代码如下:#include #include #include #include // for max() function#include using std::cout;using std::endl;using std::vector;using std::string;using std::pair;int lcs(const string &s1, con翻译 2014-08-24 20:57:27 · 650 阅读 · 0 评论 -
Rod cutting problem DP
动态规划算法的一个特点就是利用翻译 2014-08-24 20:21:17 · 1840 阅读 · 0 评论 -
Hash Table 的几点注意的地方
影响hash Table design的3个factors:(1)hash function(散列函数)(2)Table size(散列的大小, 通常最开始是固定大小的)(3)collision handling scheme(发生冲突的时候的处理机制)一个“good” hash function 应该具有如下几点属性:(1)reducing chance of col翻译 2014-08-23 14:39:13 · 1124 阅读 · 0 评论 -
C++ hash table 的编程实现
关于Hash Table, 总结如下:翻译 2014-08-21 16:26:41 · 8872 阅读 · 0 评论 -
DP 算法: cutting a rod
给定一个问题, 能够使用动态规划的翻译 2014-08-23 21:55:52 · 7169 阅读 · 0 评论 -
Finding the longest Increasing subsequence
我们可以使用动态规划()解决这个问题翻译 2014-08-11 16:42:38 · 676 阅读 · 0 评论 -
Prim‘s algorithm : 求一个Graph的MST的C++版本
本节介绍利用Prim's algorithm求如下一个Graph的MST:我们用A记录MST的所有的边。 一开始初始化为空集合。 最终, 我们返回找到的MST的边集合A。Q记录下图中的所有Vertices 的集合。Prim’s algorithm 的伪代码如下:对于Graph中的每一个vertices, 我们定义每一个vertice 的两个属性。 一翻译 2014-08-10 16:00:48 · 1526 阅读 · 0 评论 -
Kruskal algorithm
为了运行Kruskal Algorithm的一个采用C++11的算法。 我将co翻译 2014-08-09 21:51:16 · 872 阅读 · 0 评论 -
The minimum spanning tree of a graph(图的最小生成树)
Q: minimum spanning tree 的定义A: 给定一幅图G = (V,E), 找到E的一个能够连接起G中所有的节点(vertices)的边子集T, 并且边子集的权重之和最小, 这就是我们所说的最小生成树。由于T是无环的, 并且联通所有的节点, 所以T然是一棵树。上图(graph)的minimum spanning tree 为:所以现翻译 2014-08-08 13:32:04 · 3635 阅读 · 0 评论 -
Disjoint set(并查集) data structure
不相交集合(disjoint set datastructure)数据结构又be翻译 2014-08-08 14:01:53 · 8849 阅读 · 0 评论 -
C++ linked list
//C++: linked list#include #include // for system("PAUSE")#include using namespace std;struct nodeType { int info; nodeType* link;}; // 不要忘了分号nodeType* buidListForward();nod翻译 2014-07-11 10:34:31 · 1312 阅读 · 0 评论 -
素数
素数的定义: 素数又称为翻译 2014-09-02 16:25:51 · 997 阅读 · 0 评论 -
dynamic programming: coin change problem(换零钱) 变体一:
这个问题是一个可以用dynamic 的一个经典的翻译 2014-09-01 20:41:11 · 2352 阅读 · 0 评论 -
dynamic programming 之Maximum Sub-Sequence Sum(最大子序列和问题)
问题描述:给定一个整数序列, 序列中可能有负数。 目的是找出这个序列的连续子序列(即子序列的元素的选取是连续的从序列中选取的)。即通过确定i, j 的值, 使得的值达到最大。 我们定义, 当所有的元素为负数值的时候, 那么maximum subsequence sum 为0。下面我们用动态规划的技术去求解。为了找到最大连续子序列和, 不难看出, 在扩展我们的求和窗口原创 2014-09-02 14:01:32 · 1616 阅读 · 0 评论 -
反转链表(reverse a lnked list)
今天, 看到一个面试题。对于一个单项链表, 编写一个函数, 把给定的单项链表进行反转。 即最后一个元素变成新链表的第一个元素...。例如下图: 第一个field为节点存放的数据, 第二个field指的是存放下一个node的地址, head指向链表头。 反转之后, 得到新的链表如下:解决办法:我们可以遍历链表, 对于每一个当前的节点, 我们可以调整(adjust)当前原创 2015-04-20 08:54:52 · 1460 阅读 · 1 评论 -
二叉搜索
knuth 在TAOCP有过这么一句话: 虽然第一篇二分搜索在1946年就发表了, 但是第一个没有错误的二分搜索程序直到1962年才出现。 所以可以说是是最简单的难题了。问题: 给定排好序的N个distinct elements 的array, 使用最少的比较次数确定某一个值是否存在。分析: 线性查找的时间复杂度是O(n), 但是考虑到数组是sorted, 所以我们一定要利用好这个信息。原创 2015-04-12 11:02:40 · 614 阅读 · 0 评论 -
longest palindromic substring(最长回文子串)
最长回文子串(LPS)就是从给定的字符串中找出最长的一个子字符串, 这个子字符串从左往右读和从右往左读, 读出的结果是一样的。例如:aba, a, abba均是回文子串。 (方法一) bruteforce的办法: 最简单的办法就是价差字符串的每一个子字符串是否为palindrome or not。 我们可以运行三个loops, 外层两个loops 一个个的选择字符串所有可能的子字符串,原创 2015-03-19 21:40:47 · 820 阅读 · 0 评论 -
subset problem(子集和问题)
给定一个包含N个非负数的set, 并且给定K, 从集合中找出一组元素子集, 使得这组子集的各个元素相加起来和是K。 注意, 我们假设输入的set 中的各个元素均是unique的(即 no duplicates present)。方法一(穷竭搜索subset sum).。 一个比较naive的办法就是考虑这个集合的所有可能的subsets。 不难看出, 给定集合(N个元素)的subset的个原创 2015-03-13 15:41:52 · 20020 阅读 · 2 评论 -
确定一个二叉树是另一个二叉树的子树
问题: 给定两个binary trees, check 第一个二叉树是否为第二个二叉树的子树。 例如, 如下: Tree S 10 / \ 4 6 \ 30 Tree T 26 / \翻译 2015-03-12 21:56:45 · 851 阅读 · 0 评论 -
给定一个file, 查找出里面出现频率最高的10个单词
之前已经总结了给定一组数字, 如何在线性时间内找到第k小的数字。这两个问题看似有十分subtle的关系。 很显然这里是找最大的前K个单词。 单词相当于卫星数据, 直接对单词的键值, 即频率排序啦。 现在我们对这个求top K frequent words做一个小小的总结。方法一: minheap + external sort(即小顶堆 + 外部排序)之所以使用外部排序, 是因为考原创 2015-03-24 17:15:31 · 10062 阅读 · 0 评论 -
强连通分量和二部图
对于无向图G: 如果两个顶点之间有一条路径连着, 我们就说这两个顶点是连通的(无向图的边无方向性, 只要有边连着就是连通的)。 如果满足图中的任意两个顶点都是连通的, 我们就说图是连通图。 所谓的连通分量, 就是无向图中的极大连通子图。 对于连通图, 只有一个连通分量, 就是它本身。 非联通的无向图有多个连通分量。 如下图, 该无向图的连通分量分别是: (A L M J B F C), (原创 2015-03-24 16:31:49 · 1225 阅读 · 0 评论 -
Loop in List(链表中的圈)
Q: 给定一个linked list, 如何判断这个linked list 中是否有一个loop。 例如如下图:链表的一个节点定义如下:struct ListNode { int data; ListNode *next;};分析: 这是一个很有名的面试题。 我们的解法是:使用两个指针pFast和pSlow, 均初始化为指向链表头。 一个指针一次向前移动1个原创 2015-03-12 19:59:35 · 973 阅读 · 0 评论 -
寻找数组中的第k小的元素
算法导论在第九章中讲的很清楚了。 方法一: 比较naive的办法就是首先对数组排序, 然后取第k个元素。 时间复杂度随我们选择的排序算法的复杂度决定。// simple solution#include #include using namespace std;// function to return kth smallest elementint kthSmalles原创 2015-03-10 14:20:41 · 1731 阅读 · 0 评论 -
bloom filter(布隆过滤器)
今天中邪了, 觉得看看bloom filter。 看看海量数据处理的经典算法。 这是1970年提出来。 是用于检测一个元素是不是一个集合的成员。 如果检测结果为True, 则该元素不一定在该集合中。 如果检测结果为False, 表明该元素一定在这个集合中。 这说明bloom filter 具有 100%的召回率。 每个检测请求返回的结果只有两种, 也就是“在集合内(可能错误)” 和 “绝对不原创 2015-03-20 16:08:49 · 879 阅读 · 0 评论 -
bitmap算法简介
今天看到海量数据处理算法————bitmap(又称为bitset, 或者bit array), 有意思的算法。C++ 有一个头文件是。 bitmap的思想就是数据压缩。 用一个二进制bit(0或者1)去标记某个元素对应的value, 这就是bit + map啊。由于使用bit单位存储数据, 所以可大大节省内存空间。下面举一个使用bitmap 的例子。我们要对0-7内的五个元素进行排原创 2015-03-20 14:04:24 · 2425 阅读 · 2 评论 -
根据前序遍历(或者是后序遍历)和中序遍历得到的序列可以重建二叉树
前面提到可以利用前序遍历(或者后序遍历)和中序遍历唯一的决定一棵二叉树。 这是一一对应的关系。 我们利用这一事实用于确定一棵树是另一棵树的子树。在这里我们利用给定树的两个遍历序列(中序遍历必须有, 前序或者后续遍历给定一个)。 激动不。闲话少说, 直接上例子:给定如下一棵二叉树的后序遍历和中序遍历两个序列如下:In-Oder: 10, 30, 40, 50, 60, 70, 90原创 2015-03-15 10:59:34 · 1350 阅读 · 0 评论 -
C++ insertion sort(插入排序)
插入排序也是一种简单的排序算法。 对于一些large翻译 2014-07-09 22:31:05 · 1814 阅读 · 0 评论 -
C++: quick sort(快排序)
到目前为止, 我们已经学习到了插入排序, 冒泡排序, 选择排序(selection)。 这些排序算法都是comparision based sorting algorithms(即涉及到元素大小的比较来决定元素的先后顺序)。 而且算法的时间复杂度上均为O(n^2)。但是comparision based 的排序算法远非这几个算法。 而且可以通过利用其它的一些手段(例如divide and conq原创 2014-07-10 08:26:55 · 5491 阅读 · 0 评论 -
C++ STL #1
STL , 全称为standard template library, 翻译过来就是标准模板库。翻译 2014-07-21 17:21:50 · 552 阅读 · 0 评论 -
C++ delete a node from BST
首先, 从一个BST中删除一个节点可能很翻译 2014-07-21 16:32:29 · 1647 阅读 · 0 评论 -
C++ Binary Tree Traversal
关于二叉树的遍历有很多的方法, 下面介绍两个经典的遍历算法: BFS和DFS。一个是深度优先遍历, 一个是广度有优先遍历。 这两种遍历算法均属于盲目的遍历算法, 一般而言, 启发式的遍历搜索算法比较好一些。 。 关于各种遍历算法的对比, 将会在后面逐一提及。 这里不在赘述。由于树是一个非线性的数据结构, 显然不能像linked list , 或者Array那样通过从头像最末尾移动去实现遍历每一翻译 2014-07-20 15:43:52 · 1611 阅读 · 0 评论 -
C++: Find height of a Binary Tree
给定一棵二叉树, 如何确定这棵二叉树的高度(即树的最大的深度), 是一个很常见的问题。给下图回顾一下:关于高度和深度的概念, 参见上图。NOTE: 高度: 参考节点是距离节点最远的叶子深度: 参考节点是根节点 寻找二叉树的高度也可以通过一个递归函数(a recursive function)实现, 这依然源于树是一个递归的数据结构。例如, 对于下图, 我们可以求出根翻译 2014-07-20 13:30:29 · 1554 阅读 · 0 评论 -
C++ Find Min and Max element in a BST
对于一个二叉搜索树, 要想找到这棵树的最小元素值, 我们只需要从树根开始, 沿着left 孩子指针一直走, 知道遇到NULL(即走到了叶子), 那么这个叶子节点就存储了这棵二叉搜索树的最小元素。 同理, 从根节点开始, 沿着right 孩子指针, 最终找到的是最大关键字的节点。 也就是说寻找BST最小关键字的元素和最大关键字的元素的代码是对称的。伪代码如下:TREE_MINIMUM(x翻译 2014-07-20 12:44:56 · 1102 阅读 · 0 评论 -
Check Whether a tree is a BST tree
判断一棵二叉树是否为二叉搜索树(BST)是招聘面试的时候经常会遇到的一个问题。 这需要我们对BST的定义吃透。首先明确BST的如下几个特点:(1)对于每一个节点, 这个节点的左边子树的所有节点都小于这个节点(2)对于每个节点, 这个节点的右边子树的所有节点均大于这个节点以上的定义是递归的。编写程序的时候, 很容易犯如下的错误:Method1(simple but wro翻译 2014-07-21 14:31:02 · 654 阅读 · 0 评论 -
C++ implementation of DF Traversal
如下图: 这里我们实现DFS中的三种遍历方法。相关的如下:相关算法的介绍不再赘述。首先对于preorder traversal 的步骤为:其他两种算法略。具体递归调用分析, 注意学会画stack frame的图分析。 这里不再赘述。代码如下:/* Binary Tree Traversal - Preorder, Inorder, Postor翻译 2014-07-20 18:37:40 · 833 阅读 · 0 评论 -
C++ Level-Order Traversal
这里讲讲对binary Tree 进行level order Traversal.。 即BF traversal(广度优先遍历)。即首先, 访问根节点F, 打印出数据。 接着访问level 1的所有节点, 即D, J。 访问完level1之后, 访问level2, 即B, E, G , K 等等一次访问下去, 直至遍历完所有的节点。 BFS遍历的思路很简单, 但是当我们编程实现的时候,翻译 2014-07-20 17:05:44 · 2912 阅读 · 0 评论 -
C++ BST的实现中, 内存分配的情况
关于BST的实现代码, 参见上一个文章, 这里只是贴出代码:// Binary Search Tree - Implemenation in C++// Simple program to create a BST of integers and search an element in it#includeusing namespace std;//Definition of翻译 2014-07-19 22:25:53 · 1170 阅读 · 0 评论 -
C++ Implement binary search Tree(BST)
我们已经知道了关于BST的一些翻译 2014-07-19 20:35:09 · 1613 阅读 · 0 评论