行云

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

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

03 2012 档案

摘要:/* 不用关系符和if比较大小 */#define MAX(a, b) (a/b)?a:b#define MIN(a, b) (a/b)?b:a/* 上面的方法,有个缺点,b不能为0 下面的方法可以解决这个问题*/#define MAX(a, b) (a+b+abs(a-b))/2#define MIN(a, b) (a+b-abs(a-b))/2/* 交换两个数的值 */#define SWAP(a, b) (a=a^b, b=a^b, a=a^b)如果需要加入一段在main退出后执行的代码,可以用atexit函数注册一个函数。函数原型为void ()(void)void fun(void) 阅读全文
posted @ 2012-03-27 21:15 windflying 阅读(514) 评论(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 阅读(35886) 评论(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 阅读(1078) 评论(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 阅读(281) 评论(0) 推荐(0)

摘要:搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串 的长度为1-255字节。假设目前有一千万个记录, 这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个 。一个查询串的重复度越高,说明查询它的用户越多, 也就是越热门。请你统计最热门的10个查询串,要求使用的内存不能超过1G。 (1)请描述你解决这个问题的思路; (2)请给出主要的处理流程,算法,以及算法的复杂度。分析:直接放到内存需要的空间 255*1000 0000 = 255 * 10M = 2.5G (内存限制1G)去重复后300 0000 * 255 = 255 * 3M < 1 阅读全文
posted @ 2012-03-24 11:55 windflying 阅读(412) 评论(0) 推荐(1)

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

摘要:1 项目成功的关键是在投资最少的时候找出错误。2 如果在给一个程序找个好名字时感到困难,往往是对这一子程序的功能还不够清楚。3 编写工作应该从抽象到具体。4 在确定程序是正确的之前,不要急于编译。5 消除所有的编译程序指出的错误和提出警告的原因。6 应该在工作的每一个步骤检查子程序。7 最可能被改动的部分:硬件依赖部分、输入输出部分、复杂的数据结构和商务规则部分。8 总有事情可做,在深入研究和理解之后,能够改进任何解决方法,并且,在任何一种情况下,都能够进一步理解解决方法。9 一个公司如果不能挑选好掌舵人,以后替换掉他的成本也是很高的。10 人们重来都是只记得英雄的名字。11 成功的创业者必须 阅读全文
posted @ 2012-03-22 22:52 windflying 阅读(203) 评论(0) 推荐(0)

摘要:在用户输入英文单词时,经常发生错误,我们需要对其进行纠错。假设已经有一个包 含了正确英文单词的词典,请你设计一个拼写纠错 的程序。 (1)请描述你解决这个问题的思路; (2)请给出主要的处理流程,算法,以及算法的复杂度; (3)请描述可能的改进(改进的方向如效果,性能等等,这是一个开放问题)。1 用map建立字典2 跟踪用户输入,当遇到一个非字母字符时,则一个单词输入完毕。3 取得该单词,到map里面查找,存在则该单词正确,否则拼写错误。复杂度:空间复杂度存储字典的复杂度:假如有10000个单词,平均长度为8,8*20000/8Byte = 20KB时间复杂度:查找字典O(lgN, N=200 阅读全文
posted @ 2012-03-22 21:41 windflying 阅读(1180) 评论(0) 推荐(0)

摘要:1. 编程: 用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。2. 编程:用C语言实现函数void * memmove(void *dest,const void *src,size_t n)。memmove函数的功能是拷贝src所指的内存内容前n个字节到dest所指的地址上。void * memmove(void *dest,const void *src,size_t n){ if (!dest && !src || dest == src) return dest; int i=0; char *d = (char *)des... 阅读全文
posted @ 2012-03-22 21:35 windflying 阅读(226) 评论(0) 推荐(0)

摘要:有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。* 木杆很细,不能同时通过一只蚂蚁。开始 时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,* 但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。* 编写程序,求所有蚂蚁都离开木杆 的最小时间和最大时间。分析:根据题意,初始状态就决定了最终的时间。所以只要遍历所有可能的初始状态就能找出最大最小时间。每只蚂蚁的初始状态由方向、位置决定,这里位置固定了,所以只考虑可能的方向。只有两个可能的方向,所以初始状态数为2^n(n蚂蚁的数量)碰头的检查:这 阅读全文
posted @ 2012-03-22 21:06 windflying 阅读(1077) 评论(0) 推荐(0)

摘要:题目:给定n个整数,求对应的哈夫曼树的高度考虑建立哈弗曼树的过程:每次从所有节点中选择最小的两个节点组成新的节点,新节点的权值是两个节点权值之和,并删除这两个节点。因此我们可以用一个数组来实现。1 将数组降序排序 (最小的两个在末尾)2 将数组最后两个元素合并为一个,其层数为原来两个元素的最大层数加13 数组长度减一4 新数组再排序 -->第一步循环直到数组长度为1struct Node { int value; int layer;};//降序排列int cmp(const void *a, const void *b){ struct Node *t1 = (struct... 阅读全文
posted @ 2012-03-22 19:27 windflying 阅读(1617) 评论(0) 推荐(0)

摘要:给定一个字串X,求它最长字串S,使得S=SR,SR为S的反序,即如果S=abc,则SR=cba例子:X=abccba,则输出S=abccba遍历X的子串,从最长子串开始,对每一个子串判断其是否为反身字串,是则找到所需字串bool IsReverseString(const char *str, int s, int len){ const char *start = str+s, *end=str+s+len-1; while ( start <= end) { if (*start== *end) { start++, e... 阅读全文
posted @ 2012-03-22 17:38 windflying 阅读(314) 评论(0) 推荐(0)

摘要:表达式求值,一个字符串只由'+','-',和‘0’-‘9’组成,并且'+','-'只作为二元运算符。bool calculate(const char* exp, int &result);bool calculate(const char* exp, int &result){ result = 0; char str[50]; int i=0; char op; //get the first oprand while (*exp && *exp != '+' && 阅读全文
posted @ 2012-03-22 16:00 windflying 阅读(231) 评论(0) 推荐(0)

摘要:题目:1打印如下形式的矩阵;n=5:129 10 25438 11 24567 12 2316 15 14 13 2217 18 19 20 21n=6:129 10 25 26438 11 24 27567 12 23 2816 15 14 13 22 2917 18 19 20 21 3036 35 34 33 32 31分析:可以看出有这样的规律 --- 按right, down, left, down, right, up这样的路线跌增,并且只有在left,up时可能完成打印。方法:按照这个规律先生成数组,然后再打印#define N 9void PrintMatrix(){ i... 阅读全文
posted @ 2012-03-22 15:36 windflying 阅读(473) 评论(0) 推荐(0)

摘要:问题1:在Linux上一切都是文件,那么我可以通过open, close, read, write, ioctl这些函数来访问一个USB设备文件吗?----可以的问题2:那我怎么区分bulk还是interrupt传输呢?----通过ioctl问题3:既然我可以通过open,close, read, write, ioctl来访问一切设备文件,那么为什么还要有像libusb这样的库呢?----实际上在底层就是这几个函数,libusb库只不过是通过包装这几个函数,使上层更容易使用 阅读全文
posted @ 2012-03-19 21:15 windflying 阅读(192) 评论(0) 推荐(0)

摘要:如何向控制台输出彩色打印信息呢?如何订制自己的输出格式呢?下面将告诉你……import os"""0 All attributes off 默认值1 Bold (or Bright) 粗体 or 高亮4 Underline 下划线5 Blink 闪烁7 Reverse 反显30 Black text31 Red text32 Green text33 Yellow text34 Blue text35 Purple text36 Cyan text37 White text40 Black background41 Red background42 Green b 阅读全文
posted @ 2012-03-16 23:25 windflying 阅读(2191) 评论(0) 推荐(0)

摘要:from ctypes import *TenIntArrayType = c_int * 10 #相当于定义了一个int[10]类型arr = TenIntArrayType()#访问方法for ii in arr: print (ii)#或者for ii in range(10): print (arr[ii])lib = cdll.LoadLibrary("dll.so")#取指针lib.PrintData(pointer(arr), 10)ctypes基本数据类型:定义了对应于C内置类型的相应类型http://docs.python.org/release/2.5/ 阅读全文
posted @ 2012-03-16 22:02 windflying 阅读(4022) 评论(0) 推荐(0)

摘要:如何传递一个数组给动态库中的函数,并通过传递的数组返回字符串呢?这里演示一种间接的方法。不知道有没有更直接的方法?1 动态库中的函数定义:struct ss { char name[10]; int age; };void GetString(struct ss *p){ strcpy(p->name, "Hello dll."); p->age = 25;}编译生成dll.so: gcc -fPIC -O2 -shared dll.c -o dll.so2 python中调用实例:from ctypes import *class ss(Structure): 阅读全文
posted @ 2012-03-14 15:46 windflying 阅读(7047) 评论(0) 推荐(0)

摘要:首先,创建一个简单的动态库编程生成dll.so: gcc -fPIC -O2 -shared dll.c -o dll.soC文件:dll.c 如下#include <stdio.h>struct param { int a; int b; char c; float f; int arr[3]; }; void print0(struct param arg){ printf("in print:\n"); printf("a: %d\n", arg.a); printf("b: %d\n", arg.b); print 阅读全文
posted @ 2012-03-14 10:39 windflying 阅读(3814) 评论(0) 推荐(0)