- 博客(65)
- 收藏
- 关注
原创 判断无向图和有向图是否有回路
一、无向图回路的判断 对于无向图,判断其是否有回路有两种方法,如下所示: 1、利用深度优先搜索DFS,在搜索过程中判断是否会出现后向边(DFS中,连接顶点u到它的某一祖先顶点v的边),即在DFS对顶点进行着色过程中,若出现所指向的顶点为黑色,则此顶点是一个已经遍历过的顶点(祖先),出现了后向边,若完成DFS后,则图中有回路;另外,无环图中变的个数E 2、在图的邻接表表
2014-03-06 00:22:47 31305 4
原创 线程和fork
一、简介 当线程调用fork时,就为子进程创建了整个进程地址空间的副本,父子进程通过写时复制技术来共享内存页的这一副本。 子进程通过几成整个地址空间的副本,也从父进程那里继承了所有互斥量、读写锁和条件变量的状态。如果父进程包含多个线程,子进程在fork返回后,如果紧接着不是马上调用exec的话,就需要清理锁状态。 在子进程内部只存在一个线程,它是由父进程中调用fork
2014-02-27 01:08:56 1181
原创 关于浮点数
一、浮点的精度限制 看了看《深入理解计算机系统》中有关信息存储的内容,不得不感叹浮点数的存储真让人望而生畏。下面就看看编程中遇到浮点数需要注意的东西吧。 浮点数的存储格式与整数完全不同。大部分的实现采用的是IEEE 754标准,float类型,是1个sign bit,8 exponent bits,23 mantissa bits。而double类型,是1个sign bit,1
2014-01-23 21:40:42 1083
原创 信号量中的PV操作
一、信号量的概念 1、信号量的类型定义 信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。 一般来说,信号量S>=0时,S表示可用资源的数量。执行一次P操作
2014-01-12 15:26:43 1949
原创 一道有关hash的POJ题目:POJ1200 Crazy Search
一、题目描述 这里把题目粘过来吧,网页是在http://poj.org/problem?id=1200,题目描述如下: Description: Many people like to solve hard puzzles some of which may lead them to madness. One such puzzle could be finding
2013-12-27 21:39:13 1834
原创 (15)字符串
一、统计文本中各字符串出现的个数 利用map容器,代码实现如下所示:#include #include using namespace std;int main(){ map M; map ::iterator j; string t[5]={"abc","dd","abc","dd","dd"}; for(int i=0;i<5;++i) M[t[i]]+
2013-12-24 23:54:50 1006
原创 (14)堆
一、简介 堆数据结构的性质:堆:任何结点的值都小于或等于其孩子的值的完全二叉树为小根堆,任何结点的值都大于或等于其孩子的值的完全二叉树为大根堆。为了方便使用完全二叉树的性质,假定数组从下标1开始。这样:leftChild = 2*i;rightChild = 2*i + 1;parent = i/2; 堆数据结构算法分析: 堆排序的最坏时间复杂度为O(nlogn)
2013-12-24 21:29:19 894
原创 (13)搜索
一、简介 通过构造可生成一个随机整数的有序集合(不允许重复)来引出问题的讨论。C++相关的代码使用了set数据结构,具体代码如下所示:void gensets(int m, int maxval){ int *v = new int[m]; IntSetImp S(m, maxval); while(S.size() < m) S.inser
2013-12-23 22:57:36 756
转载 有意思的C语言优先级口诀
今天看到这个,有点意思,转一转。嘿嘿~一共有十五个优先级: 1 () [] . ->2 ! ~ -(负号) ++ -- &(取变量地址)* (type)(强制类型) sizeof 3 * / %4 + - 5 >> 6 > >= 7 == != 8 &
2013-12-18 19:22:04 625
原创 (12)取样问题
一、简介 问题描述:程序的输入包含两个整数m和n,其中m (1)一般情况下,如果要从r个剩余的整数中选出s个,我们以s/r的概率来选择下一个数。如下伪代码所示: select = m remaining = n for i = [0, n) if (bigrand() % remaining) < select
2013-12-15 20:01:52 866
原创 (11)排序
一、排序 本章以插入排序为伊始,进而介绍了快速排序,以及随机选取划分元素的改进的快速排序,且可根据所要排序元素的多少动态的选择是进行插入排序还是快速排序的算法(在元素较少的排序中,插入排序的运行效果可能更好)。插入排序与快速排序这里就不多介绍了。下面看一个这一章的习题。 习题第9题中要求编写一个程序,在O(n)时间内从数组x[0...n-1]中找到第k个最小的元素,算法可以对x
2013-12-15 16:19:34 899
原创 C语言中可变参数的处理va_list
今天在看UNPv2的时候看到C语言中可变参数的操作,有必要深究一下,恩。整理下。。。 va_list是在C语言中解决可变参数问题的一组宏,他有这么几个成员: 1) va_list型变量:#ifdef _M_ALPHAtypedef struct { char *a0; /* pointer to first homed integer arg
2013-12-15 10:57:41 2370
转载 Unix编程艺术中的17点编程哲学原则
Unix编程艺术中的17点编程哲学原则 ---设计开发者的至高准则 译者:July 二零一一年一月十三日。参考文献:The Art of Unix Programming By Eric Steven Raymond博主说明:本文是依据unix编程艺术一书的英文版,第一章部分章节,所做的翻译。翻译过程中,参考了其中文
2013-12-08 17:31:57 921
原创 inline函数和虚函数的区别
inline函数和virtual函数有着本质的区别,inline函数是在程序被编译时就展开,在函数调用处用整个函数体去替换,而virtual函数是在运行期才能够确定如何去调用的,因而inline函数体现的是一种编译期机制,virtual函数体现的是一种运行期机制。因此,内联函数是个静态行为,而虚函数是个动态行为,他们之间是有矛盾的。 函数的inline属性是在编译时确定的, 然而,vir
2013-12-07 21:11:40 1182
原创 各种Linux错误码
查了下网上的资料,搜寻了下Linux下的各种错误码。摘自/usr/include/asm/errno.h。。如下所示:#ifndef _I386_ERRNO_H#define _I386_ERRNO_H#define EPERM 1 /* Operation not permitted */#define ENOENT 2 /
2013-11-28 23:25:48 1983
原创 (9~10)代码调优、空间节省
一、代码调优 1、问题1--整数取模 一种算法是:k = (j + rotdist)%n; 另一种优化方法是:k = j + rotdist;if(k >= n) k -=n; 2、问题2--函数、宏和内联代码 通过宏替换函数来打破函数层次,提高算法效率。 3、问题3--顺序搜索 一种优化是设置哨兵值来测试是否已
2013-11-23 15:38:03 1041
原创 (8)算法设计
一、算法设计 1、问题描述:输入具有n个浮点数的向量x,输出是输入向量的任何连续子向量中的最大和。 有效解决方法: (1)分治算法:要解决规模为n的问题,可递归得解决两个规模近似为n/2的子问题,然后对他们的答案进行合并以得到整个问题的答案。 代码如下,最大子向量要么整个在a中,要么整个在b中,要么跨越a和b之间的边界。跨越a和b 的边界时,其最大子向量在a
2013-11-23 15:24:10 920
原创 我的GitHub
做个宣传吧,GitHub大家都知道,很好用,而且真的对于开源项目来说太牛了。先给大家介绍几个当时玩Github的时候收藏的有意思的网页吧: 1、GitHub上的一些热门开源项目:http://www.csdn.net/article/2012-07-30/2807869-GitHub-hottest-projects; 2、如何在GitHub上开源项目:http://www.c
2013-11-13 22:08:20 774
原创 (5~7)编程小事、程序性能分析及粗略估算
这几章是在没啥总结的,就码点有意思的话吧。 1、assert表示我们相信某个逻辑表达式为真,若表达式为假则会报告某种错误; 2、得到正确程序需要做的主要有:脚手架、编码、测试、调试及计时; 3、想提高程序的性能,可以从以下几个方面进行入手和综合考虑:问题定义、系统结构、算法和数据结构、算法调优、数据结构重组、代码调优、硬件; 4、如果性能问题无法回避,则在设
2013-11-13 21:57:15 864
原创 (4)编写正确的程序
一、简介 编程技巧斤斤是编写正确程序的很小一部分,大部分内容还是前三节的主题:问题定义、算法设计及数据结构的选择。 一个正确运行的程序,其需要断言、顺序控制结构、选择控制结构及迭代控制结构。并且需要使用测试用例来保证程序的正确性。二、习题 1、给定一个盛有黑豆子和白豆子的咖啡罐以及一大堆额外的黑豆子,重复一下过程,直到仅剩下一个豆子为止。 从罐子中随机取
2013-11-12 20:31:57 1035
原创 (3)数据决定程序结构
一、格式信函编程 编写一个格式信函发声器,该发声器基于格式信函模板。可将数据从控制中分离出来。二、用于特殊数据的强大工具 在实际应用中,每种工具都是用数据的某一视图来解决特定但又通用的问题。主要包括超文本、名字-值对、电子表格、数据库、特定领域的编程语言。三、原理 数据结构对软件的一个贡献就是将大程序缩小为小程序。数据结构设计还有许多其他正面影响,包括节省时间
2013-11-11 22:53:42 817
原创 说说双调排序
一、简介 双调排序(Bitonic Sort)属于排序网络(Sorting Network)的一种,它是一种可以并行计算的排序算法。 要理解双调排序,首先需要理解双调序列,双调序列定义如下: 如果序列满足以下两个条件之一,则称之为双调序列: 存在一个0≤k≤n-1,使得为升序序列,为降序序列;或存在一个标号的循环移位,使得条件1)满足。 如果n为
2013-11-10 19:23:03 2991
原创 (2)啊哈!算法
一、三个问题 1、给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数。分别考虑在有足够内存或有几个外部临时文件可用,但仅有几百字节的内存的情况下,如果解决问题; 2、将一个n元一维向量向左旋转i个位置,例如,当n=8且i=3时,向量abcdefgh旋转为defghabc; 3、给定一个英语字典,找出其中的所有变位词集合。例如,“po
2013-11-05 22:15:22 1052
原创 (1)开篇
一、抽象问题 作者在被问到一个问题:“怎样给一个磁盘文件排序”时,起初想到的是一些有关如何在磁盘上实现归并排序的简单思想。而当深究问题的细节时会发现,通过磁盘上的归并排序不能是的问题被很好的解决。于是,对问题进行更客观、更易用的形式描述: 输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7。如果输入文件中有重复的数则出错。 输出:升序排列输入整数的列
2013-11-03 20:10:49 923
原创 基数排序简介及LSD、MSD实现
一、简介 基数排序(Radix Sort)属于“分配式排序”(Distribution Sort)。基数排序法是属于稳定性的排序。设待排序列为n个记录,d个关键码,关键码的取值范围为Radix,则进行基数排序的时间复杂度为O(d(n+Radix)),其中,一趟分配时间复杂度为O(n),一趟收集时间复杂度为O(Radix),共进行d趟分配和收集。 二、算法基本思想 基数排序的
2013-11-03 13:07:21 3887
转载 通过互斥量和读写锁来实现进程间通信
一个简单的进程间锁的例子,通过在父进程声明,然后在fork出来的子进程变可以使用这个锁的对象来进程数据访问的互斥控制。直接看代码吧。。#ifndef _SHARE_LOCK_H_#define _SHARE_LOCK_H_//进程间mutex,在父进程定义,fork之后加锁解锁对父子进程间有效class ShareMutex{ public: ShareMutex::Shar
2013-10-29 21:29:58 795
转载 关于字符编码:ASCII,Unicode和UTF-8
1、ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。 上个世纪60年代,美国制定了一套字符编码,对英语
2013-10-28 23:28:01 621
原创 Linux下管道使用的一些限制
在书上和网上翻了翻,管道是单向的、先进先出的,它把一个进程的输出和另一个进程的输入连接在一起。一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读出数据。Linux管道分为无名管道和命名管道。一、无名管道pipe 无名管道具有以下特点: 1、只能用于具有血缘关系的进程之间,可用于进程或者线程间的通信; 2、半双工的通信模式,具有固定的读端和写
2013-10-26 19:01:14 1727
原创 fork后的exec
由fork创建的新进程被称为子进程。子进程和父进程继续执行fork调用之后的指令,子进程是父进程的一个副本。例如,子进程获得父进程数据空间、堆和栈的副本。注意,这是子进程所拥有的副本。父子进程并不共享这些存储空间部分。父子进程共享正文段。 由于在fork后经常跟随者exec,所以现在的很多实现并不执行一个父进程数据段、栈和堆的完全复制。作为替代,使用了写时复制技术,这些区域由父子进程共享
2013-10-26 18:35:17 2019 1
原创 有关Linux文件描述符中的close on exec标志位
首先说明下文件描述符,文件描述符标志,文件状态标志的区别: 文件描述符:标识文件用的; 文件描述符标志(目前就只有一个close-on-exec):仅仅是一个标志,当进程fork一个子进程的时候,在子进程中调用了exec函数时就用到了该标志。意义是执行exec前是否要关闭这个文件描述符; 文件状态标志:是在系统文件表中,关于write、read等标志。 cl
2013-10-26 18:16:20 1914 1
原创 神奇算法小集合
整理一些今天看到的比较神奇的算法,可以拓宽下自己的思维和视野。一、一个Float类型的绝对值 一个数值的绝对值可以通过与符号位的按位与操作来实现,对于IA32 32bit处理器,符号位是0x80000000,对于IA32 64bit来说,符号位是0x8000000000000000。下面代码为double类型的取绝对值操作。double x;/* make x = abs(
2013-10-20 19:49:03 1427
原创 随机从长度未知的数组中抽取数字,且保证每个元素被抽到的概率相同
一、题目简介 这个题目出自一道面试题,题目描述如下: 有一个函数int getNum(),每运行一次可以从一个数组V[N]里面取出一个数,N未知,当数取完的时候,函数返回NULL。现在要求写一个函数int get(),这个函数运行一次可以从V[N]里随机取出一个数,而这个数必须是符合1/N平均分布的,也就是说V[N]里面任意一个数都有1/N的机会被取出,要求空间复杂度为O(1
2013-10-19 18:00:48 1943
原创 并查集与十度好友
一、问题简介 首先说下问题吧,这里就不做广告了,在社交网络中,假设A和B是好友,B和C是好友,如果A和C不是好友,那么就说C是A的二度好友,在一个有10万人人际网络中,如何在时间O(n)时间里,找到某个人的十度好友。 查了下网上人们对这个问题解法的思路,大致有两种观点:(1)BFS;(2)并查集。对BFS解法的解释挺多,思路都比较相近,现总结如下: (1)设要查找十度
2013-10-18 22:06:55 1056 1
原创 (10)动态选路协议
一、简介 动态选路协议用于路由器间的通信。二、RIP:选路信息协议 RIP报文包含在UDP数据报中。如下所示: RIP常用的UDP端口号是520。RIP协议的routed程序正常运行过程如下: (1)初始化:在启动一个路由守护程序时,它先判断启动了哪些接口,并在每个接口上发送一个请求报文,要求其他路由器发送完整路由表。在点对点链路中,该请求是发送
2013-10-12 15:25:45 784
原创 (9)IP选路
一、简介 选路是IP最重要的功能之一。IP层工作流程如下所示:二、选路的原理 IP搜索路由表的几个步骤为: (1)搜索匹配的主机地址; (2)搜索匹配的网络地址; (3)搜索默认表项(默认表项一般在路由表中被指定为一个网络表项,其网络号为0)。 匹配主机地址步骤始终发生在匹配网络地址步骤之前。IP层进行的选路实际上是一种选路机
2013-10-12 14:46:33 1138
原创 (8)Traceroute程序
一、简介 Traceroute程序可以让我们看到IP数据报从一台主机传到另一台住进所经过的路由及IP源路由选项。二、Traceroute程序的操作 为什么不使用IP记录路由选项,而是重新开发一个新的应用程序,原因有以下三点: (1)原来不是所有的路由器都支持记录路由选项; (2)记录路由一般是单向的选项。发送端设置了该选项,那么接收端不得不从收到的IP首
2013-10-12 13:02:50 1096
原创 (7)Ping程序
一、简介 Ping程序的目的是为了测试另一台主机是否可达。该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答。一般来说,不能Ping到某台主机,就不能Telnet或FTP到那台主机。二、Ping程序 ICMP回显请求和应答报文如下所示: Unix系统在实现ping程序时把ICMP报文中的标识符字段置成发送进程的ID号。这样即使在同一台主机
2013-10-12 00:23:51 940
原创 (6)ICMP:Internet控制报文协议
一、简介 ICMP经常被认为是IP层的一个组成部分。它传递差错报文以及其他需要注意的信息。ICMP报文通常被IP层或更高层协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用户进程。 ICMP报文是在IP数据报内部被传输的,如下所示: ICMP报文的格式如下所示: 校验和字段覆盖整个ICMP报文。ICMP的校验和时必需的。ICMP报
2013-10-11 22:58:23 1172
原创 (5)RARP:逆地址解析协议
一、简介 无盘系统的RARP实现过程是从接口卡上读取唯一的硬件地址,然后发送一份RARP请求(一帧在网络上广播的数据),请求某个主机响应该无盘系统的IP地址(在RARP应答中)。感觉这个过程和上一章中的免费ARP一样。二、RARP分组格式 RARP分组格式与ARP格式基本一致,请参加(4)章中的介绍,主要差别是RARP请求或应答的帧类型代码为0x8035,而RARP请求的操
2013-10-11 19:46:05 1120
原创 (4)ARP:地址解析协议
一、简介 ARP为IP地址到对应的硬件地址之间提供动态映射。之所以称为动态是因为这个过程是自动完成的。一般应用程序用户或系统管理员不必关心。RARP是被那些没有磁盘驱动器的系统使用,它需要系统管理员进行手动设置。稍后介绍。 点对点链路不适用ARP。当设置这些链路时,必须告知内核链路每一端的IP地址。二、ARP高速缓存 ARP高效运行的关键是由于每个主机上都有一个A
2013-10-11 19:28:41 1437
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人