行云

行至水穷处,坐看云起时。

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

随笔分类 -  算法

算法、数据结构
摘要:随机生成[s,e]之间互不相同的m个整数这样考虑:从n(e-s+1)个整数取m个数,那么每个数取到的概率是m/n。怎么应用这一点呢?可以这样:随机生成[1,n]之间的一个整数,如果这个数小于等于m就表示满足了m/n的概率,即概率m/n的事件发生了。数学上的证明大概是很繁琐吧,不懂~~~代码实现如下://随机生成[s, e]之间的m个互不相同的数,并放存入p[]中void GetRandomNum(int *p, int s, int e, int m){ assert(p); int k=0; srand(time(NULL)); for (int i=s; i<=e&... 阅读全文
posted @ 2013-03-26 22:06 windflying 阅读(491) 评论(0) 推荐(0)

摘要:MD5算法简单的来说就是把任意长度的字串变换成固定长度(通常是128位)的16进制串。RFC 1321定义了MD5算法。该文档可从http://www.ietf.org/rfc/rfc1321.txt 获得。MD5的用途主要有:一致性验证。比如我们从网上下载了某个文件,网站上一般会给出该文件的MD5值,我们下载下来后,可以利用工具计算出新的MD5值,与正确的MD5值进行对照,如果不一样,则可以断定该文件下载出错或被篡改了。数字签名。可以用MD5算法对发布的程序或发布的消息生成MD5值作为签名等。密码存储。在传输过程中或存储过程中,直接用明文的密码都是很危险的。可以在传输之前先用MD5加密,存储 阅读全文
posted @ 2013-03-13 16:06 windflying 阅读(6711) 评论(0) 推荐(0)

摘要:用于测试排序算法的正确性和性能测试函数:View Code /* 分别测试 记录有序、反序、随机、所有元素相同的情况*/typedef void (*SortFun)(int *, int *);SortFun pFun;void OrderTest( int n){ clock_t start; float time_used; int *p = new int[n]; pFun = HeapSort; //ascending order int i=0; int flg; while (i<n) p[i] = i++... 阅读全文
posted @ 2012-06-07 21:29 windflying 阅读(425) 评论(0) 推荐(0)

摘要:按排序过程中依据的不同原则可分为:1 插入排序2 选择排序3 交换排序4 归并排序5 计数排序按照时间复杂度可分为:1 简单的排序方法 O(n^2), 包括直接插入排序、冒泡排序、选择排序2 先进的排序方法O(nlogn), 包括归并排序、快速排序、堆排序3 基数排序 O(d.n)各种算法的实现默认一般都是按升序排序。按稳定性分稳定排序,所有复杂度为O(n^2)的简单排序都是稳定的,基数排序也是稳定的。不稳定排序,所有性能较好的排序方法都是不稳定的。插入排序:依次插入一个未排序元素到已排序的序列中。插入排序是稳定排序,因它是每次考虑连续的两个元素。说一种方法是稳定的,是说为实现排序,它可以是稳 阅读全文
posted @ 2012-06-06 22:49 windflying 阅读(295) 评论(0) 推荐(0)

摘要:提交了N次,还是TLE。郁闷~~ 事实证明要选C++ 无语#include <stdio.h>#include <stdlib.h>inline void swap(int *a, int i, int j){ int temp; temp = a[j]; a[j] = a[i]; a[i] = temp;}//找比k大的最小数 前提:a[b...e]是倒序的 并且总是存在一个比k大的数int find(int *a, int b, int e, int k){ if (b == e) return b; if (b+1 == e) { ... 阅读全文
posted @ 2012-06-05 10:37 windflying 阅读(162) 评论(0) 推荐(0)

摘要:1 求第k个排列2 求给定排列在全排列中的序号3 求下k个排列#include <iostream>#include <stdlib.h>//#include <algorithm>#include <map>#include <time.h>using namespace std;unsigned int mp[1000+1] = {1, 1, 2, 6, 24, 120, 720};unsigned int Fatorail(int n){ unsigned int value=1; if (mp[n]) return mp[n] 阅读全文
posted @ 2012-06-04 21:04 windflying 阅读(346) 评论(0) 推荐(0)

摘要:C=A*B以C来划分,假设线程数为m,矩阵维度为n*n。那么每个线程计算C的元素个数为n*n/m;/*矩阵并行计算C=A*B --- C(i,j)等于A的第i行乘以第j列*/#include <stdio.h>#include <time.h>#include <stdlib.h>#include <math.h>#include <windows.h>/* 生成n*n矩阵*/void GenerateMatrix(float *m, int n);void PrintMatrix(float *p, int n);void Gene 阅读全文
posted @ 2012-05-28 21:38 windflying 阅读(4496) 评论(0) 推荐(0)

摘要:将整个矩阵分解为这样的小块,每次完成一对小块的计算,以提高Cache的命中率。提示:图中n=N/m计算次序为A11*B11, A11*B12,…, A11*B1n,,由于反复使用A11,因此可以提高Cache的命中率。/*矩阵分开计算C=A*B --- C(i,j)等于A的第i行乘以第j列*/#include <stdio.h>#include <time.h>#include <stdlib.h>#include <math.h>#include <windows.h>/* 生成n*n矩阵*/void GenerateMatrix( 阅读全文
posted @ 2012-05-28 20:43 windflying 阅读(11073) 评论(0) 推荐(0)

摘要:N个数中选M个数的组合问题#define N 5#define M 4char answer[N];void Print(char a[], int n){ for (int i=0; i<n; i++) { cout << a[i] << " "; } cout << endl;}void Combination(char a[], int b, int n, int k){ if (k == 0) { Print(answer, M); return; } if (k==n) { ... 阅读全文
posted @ 2012-05-15 21:31 windflying 阅读(198) 评论(0) 推荐(0)

摘要:题目:知道一棵二叉树的前序序列、中序系列,打印出它的后序系列下面算法的时间复杂度:O(n^2) -- 最坏情况就是左单支树/* Kown the preorder listing and the inorder listing of a tree, print it's postorder listing*/void PrintPostOrder(const char *pre, int s1, int e1, const char *in, int s2, int e2){ if (s1 > e1 || s2 > e2) re... 阅读全文
posted @ 2012-04-10 21:31 windflying 阅读(500) 评论(0) 推荐(0)

摘要:基本概念所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 key1 != key2 有h(key1) != h(key2)。设定义域为X,值域为Y, n=|X|,m=|Y|,那么肯定有m>=n,如果对于不同的key1,key2属于X,有h(key1)!=h(key2),那么称h为完美哈希函数,当m=n时,h称为最小完美哈希函数(这个时候就是一一映射了)。在处理大规模字符串数据时,经常要为每个字符串分配一个整数ID。这就需要一个字符串的哈希函数。怎么样找到一个完美的字符串hash函数呢?有一些常用的字符串hash函数。像BKDRHash,APHash,DJBHash,JSHash,R 阅读全文
posted @ 2012-03-27 20:35 windflying 阅读(35863) 评论(2) 推荐(6)

摘要:最大堆即大根堆 -- 求前n小最小堆即小根堆 -- 求前n大比如求前n小,对于当前元素,和最大堆的堆顶元素(即堆最大值)比较,如果小于堆顶元素,则替换堆顶元素,并调整堆。这样扫描一遍就可以得到最小的n个元素,效率非常高。问题实例:100w个数中找最大的前100个数1 INT_MIN初始化最小堆2 读入一个数,如果大于堆顶元素,则替换堆顶元素,并调整堆//base index 1#define LCHILD(i) (2*(i))#define RCHILD(i) (2*(i)+1)enum { BIGHEAP=0, SMALLHEAP=1,};//Adjust the heaptem... 阅读全文
posted @ 2012-03-26 23:32 windflying 阅读(1074) 评论(0) 推荐(0)

摘要:Bloom Filter的用途:1查询一个元素是否在一个集合中2 判重Bloom filter是一个包含m位的位数组filter长度: m位元素个数: n位hash函数个数: k个知道元素个数即n,如何确定m和k呢?这还和要求的错误率有关。1 首先,我们会确定允许的错误率E。当hash函数个数k=(ln2)*(m/n) = 0.693*(m/n)时错误率最小。2 在错误率不大于E的情况下,m至少要等于n*lg(1/E)才能表示任意n个元素的集合。但m还应该更大些,因为还要保证bit数组里至少一半为0,则m应该>=nlg(1/E)*lge 大概就是nlg(1/E)1.44倍(lg表示以.. 阅读全文
posted @ 2012-03-26 21:10 windflying 阅读(279) 评论(0) 推荐(0)

摘要:在某些应用中,因为内存资源有限制,而要排序的文件很大(比如10G的文件,只有10M的内存)主要的思想是:1 分割文件,使分割的文件能全部加载到内存。2 分别排序每一个分割的文件3 合并文件难的是合并操作1 跌增合并,一次合并两个文件。依次类推,直到最终只剩一个文件。时间复杂度主要在读取文件,要多次读取。2 利用堆,一次合并多个文件 时间复杂度主要取决于堆的查找。(堆主要用于查找当前最小的行) 或者更直接的是,每次顺序查找当前内存中的最小行。一般而言内存访问速度要快很多,因此第2中方法应该快很多。如下是一个简单的window上的实现://单行最大长度lEN_LINE - 1#define LEN 阅读全文
posted @ 2012-03-24 11:43 windflying 阅读(4276) 评论(0) 推荐(0)

摘要:1 什么是P问题? 这里的P代表Polynomial。P问题就是可以有一个确定型图灵机在多项式时间内解决的问题。即目前那些存在O(n), O(nk), O(nlogn)等多项式时间复杂度解法的问题。比如排序问题、最小生成树、单源最短路径。直观的讲,我们将P问题视为可以较快解决的问题。2 什么是NP问题?那些可以在非确定型图灵机上在多项式时间内解决的问题。(在确定型图灵机(我们在使用的计算机吗?)上可以在多项式时间内验证解是否正确,但不能在多项式时间内找出最优解的问题)。非确定型图灵机:可以理解为无限个确定型图灵机的集合。应该是说的一种强大的目前还不存在的,也与目前的计算机无法比较的一种计算机吧 阅读全文
posted @ 2011-11-09 15:03 windflying 阅读(4271) 评论(0) 推荐(0)

摘要:分治法的应用【算法】Mul(A[0…n-1], B[0…n-1], n)//计算两个大整数A[], B[]的乘积//输入:字符数组(或字串)表示的两个大整数//输出:以字串形式输出的两个大整数的乘积if (n == 1) return A[0] * B[0];//高位补0,使n成为偶数(二分需要)if (n%2 == 0) { A[0…n] = ‘0’ + A[0…n-1] ; B[0…n] = ‘0’ + B[0…n-1] ; n++;}//进行二分a1 = A[0, n/2]; //A的前半部分a0 = A[n/2, n-1]; //A的后半部分b1 = B[0, n/2]; //B的前半 阅读全文
posted @ 2011-10-02 08:30 windflying 阅读(553) 评论(0) 推荐(0)

摘要:#include <stdio.h>#include <string.h>#include <stdlib.h>#include <limits.h>void swap(unsigned char *a, unsigned char *b);/* @brief reverse an array, whose index is equal and larger than lo, and equal and smaller then high*/void reverse(unsigned char array[], int lo, int high) 阅读全文
posted @ 2011-08-24 10:33 windflying 阅读(1084) 评论(0) 推荐(0)