2014年3月28日

利用thread和sleep生成字符串的伪随机序列

摘要: 原文:http://blog.csdn.net/xusiwei1236/article/details/11990591ps:互联网上牛人真多!想想自己自己借到 编程珠玑 几个月了一页没翻,(ˇˍˇ) 哎~pps:3.29日,和小伙伴讨论这个问题的时候发觉,原文中用的随机算法不是严格随机,细心地童鞋可能会发现,按原作者的随机算法使得随机之后的字符串中,字符"A"永远也不会出现在第一个位置上,但是这样的话就造成不是严格随机,以下是改进方法:可以再增加一个全局buffer,当某个线程第一个被唤醒,把相应的字符写到buffer[0],当某个线程第二个被唤醒,把相应的字符写到buf 阅读全文

posted @ 2014-03-28 21:27 theCambrian.cpp 阅读(302) 评论(0) 推荐(0) 编辑

2014年3月26日

操作系统虚拟内存中的四种典型页替换算法(OPT,LRU,FIFO,Clock)

摘要: 原文:http://blog.csdn.net/wanghao109/article/details/13003479页面置换:在地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断(page fault)。当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。典型的置换算法有四种,如下所示:OPT:最佳替换算法(optional replacement)。替换下次访问距当前时间最长的页。opt算法需要知道操作系统将来的事件,显然不可能实现,只作为一种衡量其他算法的标准。分析:(F表示页帧最初填满时出现page fault)a.需要页面2, 阅读全文

posted @ 2014-03-26 15:32 theCambrian.cpp 阅读(2091) 评论(0) 推荐(0) 编辑

考虑一个特殊的hash函数h,能将任一字符串hash成一个整数k……

摘要: 第13题:答案转自:http://www.cnblogs.com/nrhw/p/3615769.html思路参考下面的题目:掷骰子,掷出6(或1-6间的任意数字)的需要的次数的期望。回到hash那一题: 阅读全文

posted @ 2014-03-26 14:36 theCambrian.cpp 阅读(1185) 评论(0) 推荐(0) 编辑

2014年3月25日

二叉树的遍历(C++非递归实现)

摘要: 文章真是经典!原文:http://www.cnblogs.com/microgrape/archive/2011/05/11/2043799.html其实二叉树的遍历,这么经典的东西,我自己一直都不明白。递归算法那么简洁,让人神魂颠倒;非递归算法就那么不好理解。。。最近使劲想了一想,似乎有一些眉目了,于是记录下来。【思想】(1)递归思想。虽然非递归算法没有直接使用函数递归,但是使用了栈,所以实际上仍然是递归的思想。但是它递归的是那么朦胧,让人无法捉摸。可以从以下几个方面思考:首先,三个非递归遍历的算法开始都是向左走到树的最左下方的节点,并把路上遇到的节点入栈,这其实就是递归中的前一半过程。如下 阅读全文

posted @ 2014-03-25 21:38 theCambrian.cpp 阅读(392) 评论(0) 推荐(0) 编辑

2014年3月24日

判断一点是否在一条射线的左边

摘要: 最近在看编程之美,看到4.4节,讲如何判断一个点是否在三角形内部时,第二种解法:可以通过判断点是否在边射线的左边来判断点是否在三角形内部,顿时觉得很新奇,但是看代码是,有点没看懂,为啥要用两个向量的叉积?能不能用点乘呢?其实关于点积,叉积早不知道是什么了(如果你也像我迷惑看这里:http://blog.csdn.net/fox64194167/article/details/8147460),于是google了一下,叉积,但是看来看去也没看明白为啥这个叉积就可以判断?又找小伙伴讨论,才搞明白。现总结一下:判断一个点是否在一条射线的左边可以转化成两个向量的叉积的方向只想问题设点P1,和射线P0P 阅读全文

posted @ 2014-03-24 19:50 theCambrian.cpp 阅读(4672) 评论(0) 推荐(0) 编辑

2014年3月20日

如何判断单链表是否存在环

摘要: 给定一个单链表,只给出头指针h:1、如何判断是否存在环?2、如何知道环的长度?3、如何找出环的连接点在哪里?4、带环链表的长度是多少?解法:1、对于问题1,使用追赶的方法,设定两个指针slow、fast,从头指针开始,每次分别前进1步、2步。如存在环,则两者相遇;如不存在环,fast遇到NULL退出。2、对于问题2,记录下问题1的碰撞点p,slow、fast从该点开始,再次碰撞所走过的操作数就是环的长度s。3、问题3:有定理:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接点。该定理的证明如下:当fast若与slow相遇时,slow肯定没有走 阅读全文

posted @ 2014-03-20 23:24 theCambrian.cpp 阅读(600) 评论(0) 推荐(0) 编辑

2014年3月19日

移位数组的二分查找

摘要: 一,题目 一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。二,分析 1)在此序列不断二分的过程中,由于原序列是一个递减序列经过旋转得到的,将它从任何位置分开,都会得到两个序列, 其中一个是递减序列 另一个可以通过一个递减序列通过旋转得到。 2)这样在不断地二分查找时,我们处理的序列子片段要么就是一个旋转后递减序列,要么就是一个纯递减序列, 3)无论是前者还是后者,在继续分成两个片段时,至少有一个纯递减序列(可能两个都是,如果之前的序列片段就是纯递减序列的话)。 4)这样我们可以保证能找到一个片... 阅读全文

posted @ 2014-03-19 23:08 theCambrian.cpp 阅读(684) 评论(0) 推荐(0) 编辑

字符串相关函数的实现

摘要: strcpy和memcpy都是标准C库函数,它们有下面的特点。strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。void*memcpy(void*dest,constvoid*src,size_tcount);考虑内存重叠的情况:(细节决定成败)#include "stdafx.h"#include usi 阅读全文

posted @ 2014-03-19 21:20 theCambrian.cpp 阅读(302) 评论(0) 推荐(0) 编辑

Linux 的多线程编程的高效开发经验

摘要: 简介:本文中我们针对 Linux 上多线程编程的主要特性总结出 5 条经验,用以改善 Linux 多线程编程的习惯和避免其中的开发陷阱。在本文中,我们穿插一些 Windows 的编程用例用以对比 Linux 特性,以加深读者印象。原文:http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/背景Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微和隐晦的差别。不注意这些 Linux 上的一些开发陷阱,常常会导致程序问题不穷,死锁不断。本文中我们从 5 个方面总结出 Linux 多线程编程 阅读全文

posted @ 2014-03-19 10:25 theCambrian.cpp 阅读(219) 评论(0) 推荐(0) 编辑

2014年3月18日

Peterson算法

摘要: Peterson算法是一个实现互斥锁的并发程序设计算法,可以控制两个进程访问一个共享的单用户资源而不发生访问冲突。Gary L. Peterson于1981年提出此算法。算法使用两个控制变量flag与turn. 其中flag[n]的值为真,表示ID号为n的进程希望进入该临界区. 标量turn保存有权访问共享资源的进程的ID号.//flag[] is boolean array; and turn is an integerflag[0] = false;flag[1] = false;turn;P0: flag[0] = true; turn = 1; while (fla... 阅读全文

posted @ 2014-03-18 14:10 theCambrian.cpp 阅读(605) 评论(0) 推荐(0) 编辑

导航