Algorithm/Data structure
此号已经作废
这个作者很懒,什么都没留下…
展开
-
两个指针之美
无意中看见了这篇帖子。感觉写的还不错。尤其是求链表中倒数第K个节点,其他技巧都是一些比较常见的思路了,不过也能带给我更多的思考。源:http://blog.csdn.net/dlengong/article/details/7418420使用两个指针可以轻松的解决许多算法问题,归纳出如下几种1、 判断链表是否带环带环链表的判断是链表中经常考察的内容。一个循环链表可以无休止地遍历下转载 2012-04-02 08:20:41 · 505 阅读 · 0 评论 -
C++多态
多态分编译时多态和运行时多态:编译时多态就是指函数重载,运算符重载,泛型编程。这个很好理解运行多态是指使用虚函数来实现使用基类的对象的引用或指针来访问派生类成员,即使调用派生类中由基类申明的虚函数。这个也好理解,但是要和非虚函数覆盖区别开来class Base {private: int a;public: Base(int i=100):a(i){} void原创 2012-04-23 19:20:40 · 548 阅读 · 0 评论 -
HASH_MAP
条条大路通罗马,为什么你不随便选一条?0 为什么需要hash_map用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能。例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改:岳不群-华山派掌门人,人称君子剑张三丰-武当掌门人,太极拳创始人东方不败-第一高手,葵花宝典...这些信息如果保存下来并不复杂,但是找起来比较麻烦转载 2012-04-30 14:18:37 · 499 阅读 · 0 评论 -
设计包含min函数的栈O(1)时间复杂度(笔试)
设计包含min函数的栈。定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。在入栈的时候就用一个数组dp对当前栈内的元素最小值保存#include #include #include using namespace std;class STACK {private: int size; int c原创 2012-04-20 15:09:36 · 466 阅读 · 0 评论 -
无向图求连通部件,和节点访问时刻和离开时刻
#include #include #include #include #include using namespace std; char ch[12];bool gmap[12][12];bool flag[12];queue myqueue;struct Time { int s; int e;}mytime[12];int cnt = 1;void dfs(i原创 2012-05-04 19:26:00 · 527 阅读 · 0 评论 -
二叉查找树转双向链表(笔试)
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整指针的指向 10 / \ 6 14 / \ / \ 4 8 12 16 转换后成双向链表481012141原创 2012-04-20 14:34:38 · 489 阅读 · 0 评论 -
几个关于多线程笔试题
先来个简单的,缓解下尴尬的气氛。子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码。#include #include #include #include pthread_attr_t attr;pthread_mutex_t mutex;pthread_cond_原创 2012-04-08 20:56:12 · 1319 阅读 · 1 评论 -
Dijkstra求单源最短路径(图论基础算法)
Dijkstra算法:最短路Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11669 Accepted Submission(s): 4968Problem原创 2012-05-05 20:06:03 · 842 阅读 · 0 评论 -
数划分
数的划分问题描述将整数n分成k份,且每份不能为空,任意两种分法不能相同(不考虑顺序)。例如:n=7,k=3,下面三种分法被认为是相同的:1,1,5;1,5,1;5,1,1。问有多少种不同的分法。输入:n,k(6输出:一个整数,即不同的分法。输入输出样例输入:7 3输出:4问题分析:这是一道整数剖分的问题。这类问题的数学性很强,方法也很多。转载 2012-04-26 18:58:59 · 404 阅读 · 0 评论 -
常见动态规划(DP)
1最大子数组和输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。#include #include #include using namespace std;void DP(int a[], int n) { int dp[100]; int i, j, max原创 2012-04-20 16:32:16 · 1050 阅读 · 0 评论 -
快速幂运算
普通的求幂时间复杂度为O(n);但是可以有更好的算法,实际上循环log(2,n),n^k = n^(k1*2^0 + k2*2^1 + k3*2^3 ....) k1,k2...k(log2,n)取0,1,为k的二进制中每一个bit位展开便可得。n^(k1*2^0) * n^(k2*2^1) * n^(k3*2^2).......至此,一个较优的算法出现了#include原创 2012-04-02 08:47:07 · 505 阅读 · 0 评论 -
交换两个数组使两个数组和的差最小
交换两个数组使两个数组和的差最小 /* 有两个数组a,b,大小都为n,数组元素的值任意整形数,无序; 要求:通过交换a,b中的元素,使[数组a元素的和]与[数组b元素的和]之间的差最小。*//* 求解思路: 当前数组a和数组b的和之差为 A = sum(a) - sum(b) a的第i个元素和b的第转载 2012-04-03 15:26:20 · 514 阅读 · 0 评论 -
bloom filter
一、什么是 Bloom filter Bloom filter 是由 Howard Bloom 在 1970 年提出的二进制向量数据结构,它具有很好的空间和时间效率,被用来检测一个元素是不是集合中的一个成员,这种检测只会对在集合内的数据错判,而不会对不是集合内的数据进行错判,这样每个检测请求返回有“在集合内(可能错误)”和“不在集合内(绝对不在集合内)”两种情况,可见 Bloom filte翻译 2012-03-31 10:39:34 · 456 阅读 · 0 评论 -
寻找第K小元素O(N)算法
快速排序时间复杂度:O(n*lgn)但是没必要完整排序后再O(1)选出第k元素。思想:利用快排分区思想,分界点为q,左边的数小于等于q,右边的数大于q这个规则。如果k小于左边区间个数则以左区间递归,否则在右区间递归。#include #define MAX 100000void swap(int *a, int *b){/*交换*/ int temp; temp = *原创 2012-03-16 21:22:56 · 865 阅读 · 0 评论 -
B 树、 B- 树、 B+ 树、 B* 树都是什么
http://blog.csdn.net/w174504744/article/details/7419017B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如:转载 2012-04-02 08:53:37 · 381 阅读 · 0 评论 -
N个数求最大的k个数
计划之中,每周日,做点算法题。希望能有所进步。看了一个在N个数中求k个数,我的第一感觉应该是用堆来解决。确实堆是可行的,这里给出一个快排思想的求法,时间复杂度为O(N*log2^k)。然后再弄个堆维护的例子。以前搞ACM的时候,有点浮躁,但愿能够在静下来的时候多多考虑算法。#include #include void swap(int *a, int *b) { int原创 2012-04-08 10:45:28 · 651 阅读 · 0 评论 -
堆
在求前K大数中可以用堆来维护,但是很久没碰堆这个东西了,BS下自己。重新复习一下吧。插入堆的时候,将元素放在数组尾,破坏堆的规则,使此节点上浮。删除堆顶元素的时候,首先返回堆顶元素,然后将数组尾元素置于堆顶,破坏规则,使此节点下沉。规则;数组下标从1开始。 如果当前节点为pos,则父亲节点为pos/2;左子节点为pos*2 ,右子节点为pos*2+1. 小根堆的堆顶元素最小原创 2012-04-08 15:29:10 · 527 阅读 · 0 评论 -
使用STL求第K大数
项目上需要使用C++,抽空正好把C++熟悉一下。期待接下来的这个项目能给我的C++编程能力带来提升。先来个set版本的。#include #include #include #include #include #include #include #include using namespace std;int main( ) { int a, n, k, s原创 2012-04-10 19:36:30 · 2524 阅读 · 0 评论 -
2012腾讯实习招聘笔试附加题1
一个数组a[n],求构造出一个b[n],使得b[i]=a[0]*a[1]*...a[n-1]/a[i];不能用除法和除了循环变量外的额外变量 ,要求(1)的空间复杂度,O(n)的时间复杂度。在网上看见这个题目,感觉很有意思。我的解法如下,不知道有没更好点的。#include #include void change_a2b(int a[], int len, int b[]) {原创 2012-04-08 09:22:32 · 505 阅读 · 0 评论