摘要: .bashrc里面,export LC_ALL=en_US.UTF-8 阅读全文
posted @ 2011-11-19 21:15 qsort 阅读(381) 评论(0) 推荐(0) 编辑
摘要: BLS签名记e: G*G->G’,为一个非退化的双线性映射,G和G’为素数r阶的乘法群,生成元为g。根据双线性映射的性质,e(g1^x, g2^y)=e(g1,g2)^(x*y)。要求在G上,CDH problem是困难的。BLS签名的三个函数KeyGen:选取[0, r-1]内的一个随机整数x,作为私钥sk;g^x作为公钥pk。由于CDH问题是困难的,我们相信DL问题也是困难的(虽然这一点还没有证明),从pk无法计算得到x。Signing:消息h的签名为sig=h^xVerification:验证者知道G、g^x(即pk)、h、sig’。为了验证sig’=h^x,即签名是拥有私钥x的人 阅读全文
posted @ 2011-11-19 20:05 qsort 阅读(4087) 评论(0) 推荐(0) 编辑
摘要: std::string str = "hello world" + 'b';这是个很无聊的题目,"hello world"是一个char*,‘b’被提升为一个int,因此这是一个合法的表达式。 阅读全文
posted @ 2011-10-29 17:28 qsort 阅读(683) 评论(0) 推荐(0) 编辑
摘要: ipcs是ipc的复数形式。。。ipc就是进程间通信了,SystemV遗留下来的。ipcs用来查看进程间通信的一些统计信息,如共享内存段、消息队列等;更多参见http://linux.die.net/man/8/ipcs 阅读全文
posted @ 2011-10-23 15:21 qsort 阅读(172) 评论(0) 推荐(0) 编辑
摘要: 运行时如何保证一块内存内容不被修改?解决思想是更改对应内存页的访问权限,这是一个平台相关的问题。Windows下面可以用VirtualProtectExhttp://msdn.microsoft.com/en-us/library/windows/desktop/aa366899(v=vs.85).aspxPosix下面可以用mprotect(2),http://linux.die.net/man/2/mprotect 阅读全文
posted @ 2011-10-22 12:41 qsort 阅读(192) 评论(0) 推荐(0) 编辑
摘要: FFI说的是一个语言提供的使用其他语言现有库(以及其他组件)的接口。典型的例子包括C++的extern “C”、Java的JNI、.Net的P/Invoke、Python的Python/C API等。对于新的语言,提供FFI机制是很有现实意义的。提供这样的接口,意味着可以复用已有的无数现有库,而不需要每次都从地板开始构建。对于大多数新的语言,至少要提供的,就是从这种语言到C的一个接口了。更多参见http://en.wikipedia.org/wiki/Foreign_function_interface 阅读全文
posted @ 2011-10-18 09:17 qsort 阅读(753) 评论(0) 推荐(0) 编辑
摘要: QR code, 应用最广泛的二维码,参见http://en.wikipedia.org/wiki/QR_codeQR code是有标准的,方便协作。QR code的信息容量:几十到几百个字符这个量级。由于读取可能会有错误,QR code使用了RS码来做纠错编码。 阅读全文
posted @ 2011-09-27 17:44 qsort 阅读(374) 评论(0) 推荐(0) 编辑
摘要: 有一个随机数产生器,以p的概率生成1,1-p的概率生成0,如何得到一个等概率的比特发生器?答曰,用原来的RNG生成两个bit,00和11丢弃,01和10是等概率的。。。。 阅读全文
posted @ 2011-09-27 00:34 qsort 阅读(322) 评论(0) 推荐(0) 编辑
摘要: 这里是一个place-holder,暂存一些尚未分类的内容。CDN带宽是按照峰值带宽收费的。eventfdsignalfdtimerfd (man timerfd_create)libev/libevent某个fd的读写如果是level-trigger的(epoll可以设置为edge-trigger模式),会持续产生event。 阅读全文
posted @ 2011-09-18 12:38 qsort 阅读(303) 评论(0) 推荐(0) 编辑
摘要: Shell的一些注意事项。1, 所有命令都要以分号(;)结尾,否则shell会以为你上一条命令还没有输入完,只是因为太长而分成几行输入了。2, 有路径名的时候,要用引号括起来。3, Windows下面,Windows的路径名是用\来的,如C:\Windows\System32,而Unix系的都是用/的,如/home/louyx/sec/。Postgresql对这个处理的不好,在Win下面也要用/,例如D:/nsar_forms/xxx.txt。4, 一些meta-command,也即那些不是直接sql的,一般以反斜杠\开头,常用的几个是:\cnsar; 连接到(切换到)nsar这个数据库。\i 阅读全文
posted @ 2011-09-18 12:36 qsort 阅读(295) 评论(0) 推荐(0) 编辑
摘要: 数据库之间倒腾数据的时候,可以用各个数据库的一些特定库,如MySQL的MySQLdb(http://mysql-python.sourceforge.net/MySQLdb.html),PostgreSQL的psycopg2(http://initd.org/psycopg/)等。Win下还可以用PyODBC(http://code.google.com/p/pyodbc/),这样可以降低学习成本,尤其适用于一次性倒腾的数据,同时,还方便了从Access、Excel等数据源倒腾数据。 阅读全文
posted @ 2011-09-18 12:34 qsort 阅读(395) 评论(0) 推荐(0) 编辑
摘要: 依赖注入解决的是依赖对象的创建与管理,更准确来说,是“依赖关系”的管理。以一个Coder类和一个Computer类为例,代码民工总归是要有电脑才能工作的嘛,所以Coder对象要包含一个Computer对象,即Coder类对Computer类产生依赖了。最原始的情况下,可能是类似下面这样的代码,依赖关系硬编码到代码中Coder qsort = new Coder("qsort", new Computer("Dell Optiplex 990"));硬编码带来的当然是灵活性的降低和可维护性的下降,使得Coder和Computer这两个concrete cl 阅读全文
posted @ 2011-09-09 11:05 qsort 阅读(411) 评论(0) 推荐(1) 编辑
摘要: 操作tagstack的是ctrl-]与ctrl-t:tags查看tagstack操作jumplist的是ctrl-i与ctrl-o(in/out):jumps查看jumplistcscope构造cscope数据库: cscope -Rbq,R是递归,b是build后即退出,q是创建倒排表来加快查找。:cscope find symbol xxx 列出所有这个symbol出现的地方,简写为:cs f s xxx:cscope find calling xxx 列出所有call这个function的function,简写为:cs f c xxx:cscope find called xxx 列出所 阅读全文
posted @ 2011-09-05 23:48 qsort 阅读(463) 评论(0) 推荐(0) 编辑
摘要: heap-sort基本操作a, push_heap,将新元素加入heap中。做法是先将元素加至序列最后,然后逐渐向上交换,直到到达合适位置,即所谓sift-up操作。基本操作b, pop_heap,从堆中删除根元素。做法是先将根元素交换至最后(待删除位置),然后调整新的根到合适位置,即所谓sift-down操作。基本操作c,make_heap,调整一个随机序列使其满足堆结构。以上三个基本操作STL中就有提供,用这三个基本操作,可以直接搞出heap-sort了。实际上,heap-sort只需要make_heap和pop_heap即可。push_heap在实现类似priority_queue的时候 阅读全文
posted @ 2011-08-31 17:39 qsort 阅读(1641) 评论(0) 推荐(0) 编辑
摘要: 1,实现random_shuffle:random_shuffle是STL中的一个模板算法,作用是随机重排列一对random access iterator之间的元素。基本思想是:假设序列有n个元素,先从所有元素中选一个放到位置1(即与位置1的元素交换),然后再从剩下的n-1个元素中选择一个放到位置2,以此类推。2,qsort:partition之后双向递归。qsort的实现:View Code 1 #include <string.h> /* memcpy */ 2 3 #define SWAP_ELEM(pl, pr, size) do {\ 4 char temp[size] 阅读全文
posted @ 2011-08-30 23:55 qsort 阅读(690) 评论(0) 推荐(0) 编辑
摘要: 1,一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1。最直接也最清晰的做法就是排序然后两边往中间同步走,O(nlogn) + O(n)。不过既然相同数值不重复出现,还对空间没啥说的,那就bitmap吧。。。可以做到O(n)。太无聊了,还要揣摩出题人的思路。2,一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。注意:- 5个数值允许是乱序的。比如: 阅读全文
posted @ 2011-08-23 01:07 qsort 阅读(670) 评论(0) 推荐(0) 编辑
摘要: 老题目了,带有min函数的stack。基本思想是,按照进栈顺序来扫一遍的话,min值并不是一直在变化的,可能连着过了好多个元素,min并没有变。形式化地说,若令f(j) = min(arr[1..j]),那么f(j)的图像由若干条阶跃相连的水平线段组成。因此f(j)可以将每一条线段压缩到一个元素。基本操作是:用两个栈,除了正常的stack之外,附加一个min-stack,保存当前的最小值。数据栈压入元素时,如果小于min-stack最小值,则表明f(j)出现了一个阶跃(从左向右开始了一根新的水平线),要记录下来;否则只压到数据栈即可。数据弹出的时候,检查是不是min-stack的栈顶元素,如果 阅读全文
posted @ 2011-08-23 00:08 qsort 阅读(1429) 评论(0) 推荐(0) 编辑
摘要: How to systematically generate all the permutations of a given sequence?seehttp://en.wikipedia.org/wiki/Next_permutation1, Find the largest index k such that a[k] < a[k + 1]. If no such index exists, the permutation is the last permutation.2, Find the largest index l such that a[k] < a[l]. Sin 阅读全文
posted @ 2011-08-11 00:28 qsort 阅读(1675) 评论(1) 推荐(1) 编辑
摘要: 一个单链表,其中除了next指针外,还有一个random指针,指向链表中的任意某个元素。如何复制这样一个链表呢?通过next来复制一条链是很容易的,问题的难点在于如何恰当地设置新链表中的random指针。从这个目的出发,我们要在旧链表和新链表的对应节点之间建立联系。除了在链表之外来另外开辟空间存储的方法之外,我们可以利用链表中多余的指针来连接起来。不扯淡了,上代码。这里的只是一种可能,不一定要某个指针一定要某种用途,但是思想是类似的。#include <cstdio>#include <cstdlib>#include <ctime>#include < 阅读全文
posted @ 2011-07-15 21:36 qsort 阅读(946) 评论(0) 推荐(1) 编辑
摘要: 这是一个place-holder,不断更新。1,用epoll管理listenfd accept到的connfd是惯例,不过listenfd自身也可以由epoll管理,listenfd上的EPOLLIN事件即为有新的连接进入;或者这样理解就统一起来了:对listenfd的accept,其实就是read,只不过read到的是connfd而已。 阅读全文
posted @ 2011-07-14 12:15 qsort 阅读(306) 评论(0) 推荐(0) 编辑
摘要: Conway's Law是个很有趣的论断:软件设计的架构,实际上反应了公司的组织与沟通架构,参见http://en.wikipedia.org/wiki/Conway's_Law这让我想起了一张很搞笑的各大IT公司组织架构图: 阅读全文
posted @ 2011-07-12 22:13 qsort 阅读(3112) 评论(0) 推荐(1) 编辑
摘要: bumblebee是一个托管在github的开源项目,最近这个项目代码有一次commit,引起了民工们的轰动,见https://github.com/MrMEEE/bumblebee/commit/a047be85247755cdbe0acce6#diff-1真是一个空格引发的惨案。项目代码的测试,是非常重要的环节,看看package要进入Debian stable的难度,就知道了。至少从这点来看,这个项目做的不够好。一些评论太搞笑了,摘一点放到这里。1,where's the 'like' button?2,Nooo! Everything was faster in 阅读全文
posted @ 2011-06-18 12:27 qsort 阅读(10940) 评论(4) 推荐(2) 编辑
摘要: 用过C的都知道#include,写hello world之前不都得#include <stdio.h>么。不过#include这种东西,会有很多花样,有些是常用的正规用法,有些就是很evil的用法了。1,条件包含例如,由于vc没有提供C99的stdint.h,所以跨平台的代码可能会有这样的语句:#ifdef _MSC_VER typedef __int64 int64_t#else #include <stdint.h>#endif这是常见的正规做法。2,包含非头文件譬如有些.c文件里面会写,#include "inc/aes_impl.c",这种做 阅读全文
posted @ 2011-06-09 13:36 qsort 阅读(859) 评论(0) 推荐(0) 编辑
摘要: IPVS简介IPVS是LVS项目重要组成部分,目前包含于官方Linux Kernel。IPVS依赖于netfilter框架,位于内核源码的net/netfilter/ipvs/目录。值得一提的是LVS项目是由国人发起的较有影响的开源项目之一,其发起人为章文嵩博士(毕业于国防科大)。LVS的logo如下图,这个logo很形象地说明了LVS项目的目标。IPVS通常与keepalived配合使用,后者也是LVS项目的子项目之一,用于检测服务器的状态。IPVS的三种工作模式为LVS/NAT、LVS/TUN、LVS/DR,简介如下。IPVS的LVS/NAT工作模式就是传统的NAT,进出流量都经过调度器, 阅读全文
posted @ 2011-06-08 18:02 qsort 阅读(2004) 评论(0) 推荐(0) 编辑
摘要: LoadbalancingDNSLoad Balancing最老的办法了,略。Layer-2Load Balancing即链路层的负载均衡,又称作link aggregation。Link aggregation是将多个物理链路汇聚成一个虚拟的更高带宽的链路,这样一方面可以通过组合多个物理链路来得到所需的带宽(以太网链路只有10、100、1G、10G,如果要得到4G的,则可以将四根1G的组合起来,形成一个虚拟的4G链路),一方面也提供了failover。相关的标准是802.3ad(802.3就是以太网,802.3下面有许多以太网相关的标准)。定义的协议是Link Aggregation Con 阅读全文
posted @ 2011-06-08 17:28 qsort 阅读(1512) 评论(0) 推荐(0) 编辑
摘要: 一致性哈希要解决的问题很常见:如何将许多键值(譬如md5的值域空间)分布到多个服务器节点。直接的做法是一个普通的哈希(譬如取模),但如果服务器节点可能会动态变化,每次节点的变化都会导致绝大多数映射的失效,不好。一致性哈希的做法是,将key的值域看做是一个环,每个服务器映射为多个环上的点(virtual node),所有服务器的点的集合将环分成多个区段,key->server的映射过程是:根据key找到对应的点,然后顺时针(逆时针也行,但要统一顺或者逆)找到最近的虚拟节点,该vnode对应的server,将用来处理这个key。值得注意的是,一个服务器要映射为多个virtual node(例 阅读全文
posted @ 2011-06-06 23:11 qsort 阅读(377) 评论(0) 推荐(0) 编辑
摘要: 数据库table的index是建立在一个或多个column上的一个数据结构, 选定的一个或若干个column称作index的key, 用来加快相应key所对应的record(tuple)的定位.从数据结构的角度来看, 索引是一个map, 将key映射到对应的record的指针. 索引能提供更好的查找性能, 关键之处在于, 一个block可以存储的(key, pointer_to_record)是可以很多的, 要远大于一个block存储的record的个数, 这意味着查找过程中磁盘io可以大大减少.索引可以分为dense index和sparse index, 前者对于每个record都建立索引 阅读全文
posted @ 2011-06-02 00:44 qsort 阅读(688) 评论(0) 推荐(0) 编辑
摘要: 上周末, 新鲜出炉的.已知一个字符串, 只含常见可打印ascii字符以及空格和换行, 要求进行如下过滤:1, 过滤掉前导空白和后导空白;2, 中间的连续空白字符, 只保留一个;3, 删除换行前后的空白字符;题目不难, 不过按照微软一贯的作风, 这种题目的目的不是在于考察学生会不会写程序(当然, 要是写不出就不太好了), 而是在于考察学生是不是能够考虑到方方面面的问题, "于细微处见功力".本着"测试先行"的原则, 可以先从测试用例入手, 如下所示:// Test cases for leading & trailing spaces.char a 阅读全文
posted @ 2011-05-30 20:24 qsort 阅读(665) 评论(0) 推荐(0) 编辑
摘要: Data Deduplication:http://en.wikipedia.org/wiki/Data_deduplication数据备份或传输的时候,为了降低存储或带宽开销,做一下压缩是很经常的,这是用CPU的cycle换取存储或带宽。压缩算法已经有很多的,不再赘述。data deduplication是另一种意义上的压缩:通过文件之间或文件块之间的冗余,来进行去重(deduplication)。考虑qq邮箱的超大邮件,会有用户经历过,当上传一个超大文件的时候,经过本地计算以后,页面提示用户说这个文件在服务器上面已经有了,这样就可以不用重新上传了。这就是data deduplication 阅读全文
posted @ 2011-05-23 15:15 qsort 阅读(1368) 评论(0) 推荐(0) 编辑
摘要: 例如以下的代码片段:int add(int a, int b){ return a + b;}void my_test(int *val, int (*func)(int, int)){ int a = 100, b = 200; *val = func(a, b);}void my_test2(int *val, ...){ int a = 100, b = 200; int (*func)(int, int) = *(int (**)(int, int))(&val + 1); *val = func(a, b);}int main(int argc, char **argv){ 阅读全文
posted @ 2011-05-22 14:40 qsort 阅读(488) 评论(0) 推荐(0) 编辑
摘要: 对于无法全部放入主存的大数据集进行排序,用类似于归并排序的两趟多路外排序。第一趟,将数据集分为多个片段,每个片段都可以放入主存,则用qsort这样的主存排序算法进行排序,然后每个片段都写回外存(磁盘);第二趟,将各个片段进行归并。每次,从第一趟得到的已排序过的各个片段中取第一个,排序以后写入最终的排序文件。这一趟可以做一些优化,如每次从各个片段中取一个块,当某个片段中的块用完的时候就取下一块,而输出则是预留一定大小的输出缓冲区,满了以后刷到最终的排序文件。对通常的数据大小来说,两趟就够了。第一趟,所有数据都要读入和写出一次;第二趟,所有数据也要读入和写出一次。 阅读全文
posted @ 2011-05-21 23:40 qsort 阅读(830) 评论(1) 推荐(0) 编辑
摘要: 还有一种经常使用的策略是bitmap.Bitmap本身也是一种hash-table, 只不过hash的结果恰好落在[0, sizeof_bitmap_in_bits]内. 因为hash到的每个slot只有一个bit,所以通常用作判断是否存在等bool型的问题.例子, 已知40亿个不重复的unsigned int, 如何判断一个整数在不在这40亿个整数里面?给定说unsigned int,其实是指定了元素的可能范围, [0, 2^32 – 1]中, 注意2^32=42,9496,7296, 大约是42亿.判断存在与否, 一个bit就够了,而记录所有的uint32_t, 4GB/8=512MB的b 阅读全文
posted @ 2011-05-10 22:20 qsort 阅读(968) 评论(0) 推荐(0) 编辑
摘要: 问题:日志文件中, 寻找10个访问量最大的IP地址类似的变种还有:1, 搜索引擎搜索记录中, 寻找10个最热门的搜索词;2, 一个大文件里面, 寻找10个出现频率最高的单词;3, web proxy的记录里,寻找前10个访问最多的url;4, 对搜索引擎的搜索记录按照频率进行排序;5, 海量数据中,找到出现频率最高的一个;这些问题一般都要求数据无法完全放入内存, 要么强调数据有100G, 300G, 要么强调只能用1G内存什么的. 这么要求的目的在于避免被提问者直接走一遍统计一下完事.解决的思路是divide andconquer, 而divide的办法是对key或者元素进行hash, 然后分 阅读全文
posted @ 2011-05-10 21:52 qsort 阅读(758) 评论(0) 推荐(0) 编辑
摘要: 如何选择合适的bitmap大小以及hash函数的个数?数学分析略,可参见wiki上面的页面(简单的概率论知识),结论如下:给定允许的错误概率p,以及元素个数n,总的bit数m应为:m >= -n*ln(p) / (ln2) / (ln2)譬如,如果给定错误率p为0.001,代入可得 m >= 14.4n给定n和m以后,选择多少个hash function也是一个问题,结论如下:hash函数的个数k应为:k = m * ln2 / n,也即 k = 0.7 * m / n.再次用上面的p=0.001的例子,m >= 14.4n, 那么k = 0.7 * 14.4 = 10如果p 阅读全文
posted @ 2011-05-10 12:49 qsort 阅读(293) 评论(0) 推荐(0) 编辑
摘要: 拓扑排序:应用于DAG图。先遍历一遍(DFS、BFS),每个节点标记入度(in-degree)。入度 为0的节点,放入一个队列。初始时,该队列中的元素都是第一批的点(不依赖于任何其他元素);之后,弹出该队列中所有元素,将其后继结点的入度减一,如果后继节点入度降为0,则放入该队列。重复以上步骤,这样就分批次的标记上了依赖关系的排序。单源最短路径Dijkstra:是一个集合不断扩张和节点距离不断更新(减小)的过程,两个要点:如何更新节点的距离、如何选择下一个节点加入S。初始时,集合S仅包含源点s,其他节点的到源点的距离Dist设为无穷。将当前节点curr设为s之后,对当前节点s,如果s的某个邻居w 阅读全文
posted @ 2011-05-10 00:07 qsort 阅读(816) 评论(0) 推荐(0) 编辑
摘要: 恰当安排可以减少比较次数,见下。求序列中最大数和最小数的时候,naive的做法(分别求)需要比较大约2n次。更好的做法是:假设易知max和min是前k个元素的最大和最小,那么,将k+1与k+2先比较一下,然后,大的和max比,得到新的最大;小的和max比,得到新的最小。这样,每向后走两个元素,只需要三次比较,最终的比较次数大约是3n/2次。求序列中最大的两个数,可以这么做:假设max1, max2是一个子集A的最大和次大元素,max3, max4是另一个子集B的最大和次大元素,那么,Union(A, B)的最大元素只可能是max1和max3中比较大的一个,假设max1>max3,那么次大 阅读全文
posted @ 2011-05-09 22:50 qsort 阅读(502) 评论(0) 推荐(0) 编辑
摘要: qsort的每一趟中,选定pivot以后,partition的过程如下:开始时,ptrLeft,ptrRight分别指向数组两端;*ptrLeft小于pivot时,向右走;*ptrRight大于pivot时,向左走;ptrLeft和ptrRight都走不动的时候,交换对应的元素,继续。ptrLeft和ptrRight相遇的时候,结束这一趟,然后二分的对两边继续qsort。更新:这样的做法需要处理各种特殊情况(略),因此更好的思路是:partition的时候,思路是:1,将pivot放到序列末尾;2,两个指针ptr_old_curr、ptr_new_curr从左向右扫描,如果*ptr_old_c 阅读全文
posted @ 2011-05-09 22:39 qsort 阅读(743) 评论(0) 推荐(0) 编辑
摘要: 实质都在于找到相应的递推关系。对于n种物体k1-kn,大小为K的背包问题来说,递推关系是:P(n, K) = P(n-1, K) || P(n-1, K-kn),也即,根据当前物体kn是不是被选中,来二分。对于树的直径问题,记f(t)为以节点t为根的子树的直径,h(t)为以节点t为根的子树的高度,则f(t) = max{ f(left), f(right), h(left) + h(right) + 2 }对于叶子节点,f与h均为0,则递归关系找到了。对于集合的划分问题(一个整数集合,是否存在一种划分,使得两个子集合中元素的和相等),立刻可以转化为背包问题。 阅读全文
posted @ 2011-05-09 22:08 qsort 阅读(277) 评论(0) 推荐(0) 编辑
摘要: Bloom Filter是一种概率数据结构(probabilistic data structure),对外提供的是一个set的接口。参见http://en.wikipedia.org/wiki/Bloom_filter-----------------------------------------------------注:set、map这些,通常称作是抽象数据结构,也即它们只是规定了一组可能的操作作为其接口,而不限制内部的具体实现。set的接口通常包括:a) 元素与集合的运算,test for in or not in;b) 集合与集合的运算,intersection、union etc 阅读全文
posted @ 2011-05-06 18:04 qsort 阅读(590) 评论(0) 推荐(0) 编辑
摘要: 假设集合A有n个元素,集合B有m个元素,两个集合取自某个空间(universe)。1.1, 首先从最naive的办法开始。对B中元素,挨个测试是不是在A中,交集、并集都是O(m*n),平方级别的算法。1.2, 将A先排序,O(n*logn),然后,对B中元素,挨个测试是不是在A中,这时可以二分了,O(m*logn),一共是O(n*logn)+O(m*logn)=O((m+n)*logn)。所以如果m<n的话,对调一下A和B比较好,也就是复杂度是O( (m+n) * log( min(m, n) ) ).这种思路的本质是,只利用了“A是集合”这个事实,然后对B中元素进行is in A的测试 阅读全文
posted @ 2011-05-06 17:47 qsort 阅读(477) 评论(0) 推荐(0) 编辑