随笔分类 -  Algorithm

摘要:Hash表#ifndef _HASH_H#define _HASH_H#include#includeclass HashTable{public: HashTable(unsigned int size); ~HashTable(); int get(const char *ke... 阅读全文
posted @ 2014-08-31 16:24 米其林轮船 阅读(285) 评论(0) 推荐(0)
摘要:#include#include#includeint RandomPartition(int *A,int beg,int end){ if(A == NULL || beg>end) { exit(0); } int i=beg; int j=end;... 阅读全文
posted @ 2014-08-30 22:36 米其林轮船 阅读(227) 评论(0) 推荐(0)
摘要:求给定整数数据中的第i小的数如果数据量很大,不能一次读入内存,可以将数据分区间储存。具体而言,就是讲数据分为...-2^20~-1,0~2^20-1, 2^20~2*2^20-1,2*2^20~3*2^20-1....并统计每个区间有多少个数据。这样就可以判断第i小的数在哪个区间。并且可以判断它在该... 阅读全文
posted @ 2014-08-30 22:06 米其林轮船 阅读(206) 评论(0) 推荐(0)
摘要:在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数。思路: bitmap用一个bit来代表存在还是不存在,现在我们要判断重不重复,则需要三个状态:不存在,存在一个,存在多个。2bits可以表示四个状态,令00表示不存在,01表示存在1个,10表示存在多个,11无意义。 令2b... 阅读全文
posted @ 2014-08-30 10:53 米其林轮船 阅读(779) 评论(0) 推荐(0)
摘要:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?其实这一题有个问题,如果只要判断一次的话,那就遍历这40亿个数就好了,时间复杂度O(n),没有更快的了。但是如果要判断两个数,三个数,那就要多次遍历所有数,显然是不行的。思路: ... 阅读全文
posted @ 2014-08-29 18:58 米其林轮船 阅读(312) 评论(0) 推荐(0)
摘要:有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。思路: 把这1G的数据一次性全部读入内存是不可能了,可以每次读一行,然后将该词存到一个哈希表里去,哈希表的value是词出现的次数。 现在的问题是,这个哈希表有多大,能不能装载1M... 阅读全文
posted @ 2014-08-29 17:27 米其林轮船 阅读(2253) 评论(0) 推荐(1)
摘要:如果数据量过大,超过最大的内存容量,那么一次性将所有数据读入内存进行排序是不可行的。例如,一个文件每一行存了一个整数,该文件大小为10GB,而内存大小只有512M,如何对这10GB的数据进行排序呢?外部排序就是为了解决这种问题的。思路: 外部排序的思路是,将超大文件分成若干部分,每一部分是可以读入... 阅读全文
posted @ 2014-08-28 22:28 米其林轮船 阅读(3454) 评论(0) 推荐(0)
摘要:#include#include#includestruct Node{ int key; Node *next; Node(int k) { key = k; next = NULL; }};void Insert(Node **phead... 阅读全文
posted @ 2014-08-26 21:48 米其林轮船 阅读(171) 评论(0) 推荐(0)
摘要:#include#include#includestruct Node{ int key; Node *next; Node(int k) { key = k; next = NULL; }};void Insert(Node **phead... 阅读全文
posted @ 2014-08-26 20:26 米其林轮船 阅读(146) 评论(0) 推荐(0)
摘要:#include#include#includevoid CountingSort(int *A,int len,int k){ int *B = new int[len]; //输出数组 memset(B,0,len*sizeof(int)); int *C = new int[... 阅读全文
posted @ 2014-08-26 19:22 米其林轮船 阅读(162) 评论(0) 推荐(0)
摘要:#include#include#includevoid swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp;}int myrand(int left, int right){ return (left+rand(... 阅读全文
posted @ 2014-08-09 19:33 米其林轮船 阅读(174) 评论(0) 推荐(0)
摘要:一.全排列无重复字符#include#includechar buf[1024];void func(int index);void swap(int index1,int index2);int main(){ memset(buf,0,sizeof(buf)); sprintf(bu... 阅读全文
posted @ 2014-08-09 11:25 米其林轮船 阅读(224) 评论(0) 推荐(0)
摘要:#include#includeclass KMP{public: KMP(const char *P,const char *Q); void Deal();private: void GenPi(); void Search(); char q[1024]; ... 阅读全文
posted @ 2014-08-08 09:50 米其林轮船 阅读(241) 评论(0) 推荐(0)
摘要:01背包的状态转换方程f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ), f[i-1,j] }f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值。Pi表示第i件物品的价值,Wi表示第i件物品的重量。决策:为了背包中物品总价值最大化,第 ... 阅读全文
posted @ 2014-08-02 22:13 米其林轮船 阅读(171) 评论(0) 推荐(0)
摘要:动态规划经常被用来作为这个问题的解决手段之一。整数 Levenshtein距离(字符串 str1[1..m], 字符串 str2[1..n])//声明变量, d[i , j]用于记录str1[1...i]与str2[1..j]的Levenshtein距离int d[0..m, 0..n]//初始化f... 阅读全文
posted @ 2014-06-11 20:30 米其林轮船 阅读(184) 评论(0) 推荐(0)
摘要:? 通配一个字符* 通配零至多个字符首先确定通配的字符串去掉*后,其长度比要匹配的字符串的长度小,这样就可以按照通配字符串来移动迭代器,而不必担心要匹配的字符串会越界。第一个*以前的字符串要严格匹配,第一个*以后的字符串,要属于匹配字符串。#include#include#include#inclu... 阅读全文
posted @ 2014-06-01 09:44 米其林轮船 阅读(203) 评论(0) 推荐(0)
摘要:子串是连续的一:刻画最优解结构特征用c[i,j]表示以a[i],b[j]结尾的最大公共子串中的字符数。则max(c[i,j]) (0b[j])三:自底向上的方法i和j递增四:构造最优解确定i,j和c[i,j],也就能反推出最大公共子串代码如下:#includeusing namespace std;... 阅读全文
posted @ 2013-12-19 09:42 米其林轮船 阅读(238) 评论(0) 推荐(0)
摘要:子串是连续的一:刻画最优解的结构特征设字符串为a,c[i]表示以a[i]结尾的所有子串中最大和子串的和。则a的最大和子串的和就是max(c[i]),0=0)三:自底向上的方法for i = 0 to len(a)-1,由于c[i]依赖c[i-1],所以i递增。四:构建最优解在球最大和的时候,可以记录... 阅读全文
posted @ 2013-12-18 22:23 米其林轮船 阅读(228) 评论(0) 推荐(0)
摘要:子串和子序列有区别,子串是连续的,子序列不一定连续。例如字符串 "bdsdksldjfkdls",它的一个子串为"dsdk",它的一个子序列为"bdklj"(1,2,5,7,9)。一:刻画最优解的结构特征假设序列为a,从a[i]到a[j]所包含的最大回文子序列的字符数为c[i,j],则所求的就是c[... 阅读全文
posted @ 2013-12-18 22:04 米其林轮船 阅读(361) 评论(0) 推荐(0)