摘要:
在某些应用中,因为内存资源有限制,而要排序的文件很大(比如10G的文件,只有10M的内存)主要的思想是:1 分割文件,使分割的文件能全部加载到内存。2 分别排序每一个分割的文件3 合并文件难的是合并操作1 跌增合并,一次合并两个文件。依次类推,直到最终只剩一个文件。时间复杂度主要在读取文件,要多次读取。2 利用堆,一次合并多个文件 时间复杂度主要取决于堆的查找。(堆主要用于查找当前最小的行) 或者更直接的是,每次顺序查找当前内存中的最小行。一般而言内存访问速度要快很多,因此第2中方法应该快很多。如下是一个简单的window上的实现://单行最大长度lEN_LINE - 1#define LEN 阅读全文
摘要:
1 项目成功的关键是在投资最少的时候找出错误。2 如果在给一个程序找个好名字时感到困难,往往是对这一子程序的功能还不够清楚。3 编写工作应该从抽象到具体。4 在确定程序是正确的之前,不要急于编译。5 消除所有的编译程序指出的错误和提出警告的原因。6 应该在工作的每一个步骤检查子程序。7 最可能被改动的部分:硬件依赖部分、输入输出部分、复杂的数据结构和商务规则部分。8 总有事情可做,在深入研究和理解之后,能够改进任何解决方法,并且,在任何一种情况下,都能够进一步理解解决方法。9 一个公司如果不能挑选好掌舵人,以后替换掉他的成本也是很高的。10 人们重来都是只记得英雄的名字。11 成功的创业者必须 阅读全文
摘要:
在用户输入英文单词时,经常发生错误,我们需要对其进行纠错。假设已经有一个包 含了正确英文单词的词典,请你设计一个拼写纠错 的程序。 (1)请描述你解决这个问题的思路; (2)请给出主要的处理流程,算法,以及算法的复杂度; (3)请描述可能的改进(改进的方向如效果,性能等等,这是一个开放问题)。1 用map建立字典2 跟踪用户输入,当遇到一个非字母字符时,则一个单词输入完毕。3 取得该单词,到map里面查找,存在则该单词正确,否则拼写错误。复杂度:空间复杂度存储字典的复杂度:假如有10000个单词,平均长度为8,8*20000/8Byte = 20KB时间复杂度:查找字典O(lgN, N=200 阅读全文
摘要:
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... 阅读全文
摘要:
有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。* 木杆很细,不能同时通过一只蚂蚁。开始 时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,* 但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。* 编写程序,求所有蚂蚁都离开木杆 的最小时间和最大时间。分析:根据题意,初始状态就决定了最终的时间。所以只要遍历所有可能的初始状态就能找出最大最小时间。每只蚂蚁的初始状态由方向、位置决定,这里位置固定了,所以只考虑可能的方向。只有两个可能的方向,所以初始状态数为2^n(n蚂蚁的数量)碰头的检查:这 阅读全文
摘要:
题目:给定n个整数,求对应的哈夫曼树的高度考虑建立哈弗曼树的过程:每次从所有节点中选择最小的两个节点组成新的节点,新节点的权值是两个节点权值之和,并删除这两个节点。因此我们可以用一个数组来实现。1 将数组降序排序 (最小的两个在末尾)2 将数组最后两个元素合并为一个,其层数为原来两个元素的最大层数加13 数组长度减一4 新数组再排序 -->第一步循环直到数组长度为1struct Node { int value; int layer;};//降序排列int cmp(const void *a, const void *b){ struct Node *t1 = (struct... 阅读全文
摘要:
给定一个字串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... 阅读全文
摘要:
表达式求值,一个字符串只由'+','-',和‘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 != '+' && 阅读全文
摘要:
题目: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... 阅读全文
摘要:
问题1:在Linux上一切都是文件,那么我可以通过open, close, read, write, ioctl这些函数来访问一个USB设备文件吗?----可以的问题2:那我怎么区分bulk还是interrupt传输呢?----通过ioctl问题3:既然我可以通过open,close, read, write, ioctl来访问一切设备文件,那么为什么还要有像libusb这样的库呢?----实际上在底层就是这几个函数,libusb库只不过是通过包装这几个函数,使上层更容易使用 阅读全文