摘要:
今天看了编程珠玑的column1,其中Problem1是假设内存足够大,如何用库函数实现对100w个数的排序,而Problem2是让实现bit vector操作(bset,clear, test),Problem3让实现bitmap sort 并和Problem1的sort做比较。先来讲一下bit vetcor,它其实是数据压缩的一种方式。思想是利用每一个bit代表一个数,1个int 有32bit ,故一个int可以表示32个数。举个例子说,现在有一个int a,那么a的低位到高位分别代表0~31(每一位是1或0,1表示有该数,0表示没有);假如现在有集合{1,2,5,8},则a的二进制为(高 阅读全文
摘要:
竞争条件(Race condition)两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序。临界区(Critical region)对共享内存进行访问的程序片段称作临界区域(critical region)或临界区。如果适当安排,使两个进程不可能同时处于临界区中,就能够避免竞争条件。尽管这样能避免竞争条件,但它不能保证使用共享数据的并发进程能够正确和高效地进行协作。对于一个好的解决方案,需要满足以下四个条件:任何两个进程不能同时处于其临界区。不应对CPU的速度和数量做任何假设。临界区外运行的进程不得阻塞其他进程。不得使进程无限期等待进入临界区。信号量(Semaphore)有时 阅读全文
摘要:
题目:求1+2+……+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字及条件判断语句(A?B:C)思路:已知1+2+……+n = n(n+1)/2,但是题目条件限制,故公式不能用。求和无外乎循环和递归,但是一般的循环需要用for或while,递归需要用判断语句if,因此要改变思路去思考。基于循环的做法:利用构造函数。设置类中的静态变量N 和sum,每次实例化对象调用构造函数时把N自增并加到sum上。求1~n的和就是要实例化n个对象。 1 class Temp 2 { 3 public: 4 Temp() 5 { 6 +... 阅读全文
摘要:
前面讲到对一系列的区间合并,里边定义了结构1 struct myDataType2 {3 unsigned int a;4 unsigned int b;5 bool flag;6 };具体参考:http://www.cnblogs.com/ivorfeng/archive/2013/04/30/3052022.html那如果是对IP区间的合并呢?首先先回顾一下关于IP的知识。一个IP地址由32bit组成,形式上为x.x.x.x,每一个x的范围是0~255,即1Byte = 8 bit。也就是说,对于每一个IP地址,我们都可以将其看成是32bit的数,对应于计算机里的u... 阅读全文
摘要:
编译时要加上-g参数利用gdb对一个可执行文件进行调试的命令为:gdb filename这告诉gdb装入filename的可执行文件进行调试。gdb常用命令quit - 退出gdb,简写“q”run - 执行当前被调试程序,简写“r”kill - 终止正在调试的程序step - 执行一行源代码而且进入函数内部,简写“s”next - 执行一行源代码不进入函数内部,简写“n”break - 设置断点backtrace - 回溯跟踪,简写“bt”frame n - 定位到发生错误的代码段,n为backtrace 命令输出结果中的行号print - 打印表达式或变量的值,或打印内存中某个变量开始的一 阅读全文
摘要:
声明:以下内容为阅读《linux C 编程-从初学到精通》时做的笔记。使用gcc编译程序时,编译过程细分为4个阶段:预处理(Pre-Processing)编译(Compiling)汇编(Assembling)链接(Linking)编译初步假如有文件hello.c,直接使用gcc hello.c ,则gcc编译默认产生a.out,运行该文件输入./a.out可以使用-o选项改变编译后的文件名,如 gcc -o hello hello.c,编译后产生hello,执行./hello即可运行。gcc 的警告提示功能一般使用gcc编译时,加上-Wall 会产生尽可能多的有用警告信息。如 gcc -Wal 阅读全文
摘要:
有两个相同的栈,一个里面放着自大到小排列的数,栈顶的数最小,另一个栈是空的。不允许利用其它的数据结构,只能利用这两个栈,要求把第一个栈里的数字反过来,从小到大排列,结果还放在原来的那个栈里面。思路:假设stackA存放数,stackB为辅助栈。stackA元素个数为N。第1次操作:先取stackA栈顶元素,记为tmp,然后把剩余N-1个元素转移到stackB中,接着把tmp和stackB的N-1个元素依次压入stackA中,这样完成了stackA原栈顶的反转。第2次操作:先取stackA栈顶元素,记为tmp,因为栈底有一个元素已完成反转,故只需要把剩余的N-2个元素转移到stackB,接着把t 阅读全文
摘要:
前面已经实现了两个栈实现队列的功能(http://www.cnblogs.com/ivorfeng/archive/2013/05/01/3053206.html),今天就实现利用两个队列实现栈的push和pop功能。思路:已有queue1和queue2;进栈:初始时,两个队列均为空,元素压入queue1;之后需要判断压入非空的队列中;出栈:出栈时,两个队列必有一个为空,另一个非空,因此需要把非空的队列只留下最后一个元素,其他均转移到另一个队列中;再把之前剩下的一个元素输出。ps:出栈的时候,一开始想着统一代码,想把已经转移到另一个队列的元素再转回来,这样就可以保持每次只对其中一个队列(que 阅读全文
摘要:
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted);前提:默认输入的待删除节点在链表中!链表结点结构定义如下:1 struct ListNode2 {3 int m_nValue;4 ListNode* m_pNext;5 };思路:若待删结点的下一结点非空,则把它的值复制给待删节点,然后释放待删结点的下一结点; 若待删结点的下一结点为空且等于待删结点等于头结点,则释放之; 若上面两种情况都不是,即为尾结点,需要从头遍历而... 阅读全文
摘要:
以下内容是本人学习vim文本编辑器时的一些笔记。关于vim教程:可以在Terminal下键入vimtutor进入vim的学习教程。Lession 11.光标移动。键盘上h,j,k,l分别对应 向左,向上,向下,向右移动,当然也可以用方向键。2.退出vim。vim有两种模式,一种是正常模式(normal mode),一种是编辑模式(不知道这样称呼标准不?)。正常模式可以利用h,j,k,l进行文本的浏览;键入i进入编辑模式。按ESC退出编辑模式返回到normal mode。需要退出vim时,先按ESC确保当前是normal mode,接着键入":q!"<Enter> 阅读全文