- 博客(106)
- 资源 (4)
- 问答 (1)
- 收藏
- 关注
翻译 Effective modern C++ 条款 40:注意不同线程句柄的析构函数的行为
Item 39提到,一个joinable的std::thread对象对应了一个执行线程。一个非延迟任务(见Item 38)的std::future对象与系统线程也有类似的关系。因此,std::thread和std::future对象都可以看作线程的句柄。 从这个角度来看,std::thread和std::future的析构函数的区别如此之大就变得很有趣了。如Item 39所述,析构一个j
2015-10-19 09:23:11
1937
翻译 Effective modern C++ 条款 39:让std::thread在所有路径上不可join(Make std::threads unjoinable on all paths)
每个std::thread对象都处于两种状态之一:joinable和unjoinable。一个joinable的std::thread对象对应一个正在运行或处于可以运行状态的异步执行的线程。例如,一个处于阻塞状态或者等待被调度的线程是joinable的。 一个unjoinable的线程正如你所期待的:它不可以被join。unjoinable的std::thread对象包括:默
2015-10-19 09:18:32
2123
翻译 Effective modern C++ 条款 38:如果异步至关重要请指定std::launch::async
当你调用std::async来执行一个函数(或其他可执行体),你通常是想要异步执行这个函数的。但是std::async并不一定会那样做。实际上你是在要求函数按照std::async默认启动策略来运行函数。有两个标准策略,它们分别代表std::launch中的一个scoped枚举(详见Item10)。假设一个函数 f 被传至std::async来执行,std::launch::async
2015-10-16 09:52:19
2219
翻译 Effective modern C++ 条款37:基于任务编程优先于基于线程编程(Prefer task-based programming to thread-based)
有两种方法可以用来异步的运行一个函数doAsynWork。你可以创建一个std::thread来运行doAsynWork,以下是基于线程(thread-based)的方法: intdoAsyncWork(); std::thread t(doAsyncWork); 或者你可以将doAsynWork作为参数传入std::async,这种方法
2015-10-15 09:53:07
1437
转载 C++异常机制的实现方式和开销分析
原文链接:http://baiy.cn/doc/cpp/inside_exception.htmC++异常机制的实现方式和开销分析白杨http://baiy.cn 在我几年前开始写《C++编码规范与指导》一文时,就已经规划着要加入这样一篇讨论 C++ 异常机制的文章了。没想到时隔几年以后才有机会把这个尾巴补完 :-)。还是那句开场白:“在恰当的场合使用恰当的特性” 对每
2013-11-07 09:44:16
828
原创 一个数被3除余2,被5除余3,被7除余2,求满足条件的前N个数
首先找到第一个满足条件的数为23,那么设下一个数为23+x,则有如下三个关系式成立:(23+x)%3 = 2(23+x)%5=3(23+x)%7=2根据求余数的关系我们有(x+y)%n = (x%n+y%n)%n,根据这个等式,上面三个等式则变换为:23%3 + x%3 = 2 + x%3 = 223%5 + x%5 = 2 + x%5 = 323%7 + x%7
2013-10-15 22:10:34
6474
原创 一道关于排序的算法题
题目:给定一个无序数组A,一直这个数组A中的任意一个元素所在的位置离其最终排序后的位置相差的距离不会超过k。即排序前A[i]在位置i,那么在排序后该元素的位置会在[i-k,i+k]这个范围内。现在要求给出一个算法使得算法尽量高校。解析:这里就不多说了,直接给自己的解法吧。利用一个大小为k+1的最小堆作为辅助。按照如下步骤即可完成对数组的排序:1.初始时用A的前k+1个元素建立最小堆,设
2013-10-14 12:04:33
1166
原创 百度2014校园招聘算法题--在数组中查找指定的元素t
题目:给定一个整数数组A,已知这个数组的任意相邻的两个元素差的绝对值为1。现在给定一个数值t,给出一个算法查找t是否在数组中,若在则给出t所在的位置。解析:对于无序数组中的查找问题,最直接也是唯一的方法就是将数组遍历一遍,找看t是否在数组中。但是这里的数组有一个特性,就是相邻的元素之间的差值绝对值为1,也就是说如果当前的数值为x,则其下一个数不是x+1就是x-1。那么我们应该如何利用这个信
2013-10-14 11:00:18
1374
转载 伸展树(Splay Tree)尽收眼底
原文地址:http://dsqiu.iteye.com/blog/1706592伸展树(Splay Tree)尽收眼底 本文内容框架:§1 伸展树定义§2 伸展树自底向上伸展 §3 伸展树自顶向下伸展§4 伸展树基本操作,实现以及应用§5 小结 §1 伸展树定义
2013-10-10 12:03:21
1202
原创 STL中排序相关算法选择
在STL中与排序相关的算法有:sort、stable_sort、partial_sort、nth_element、partion以及stable_partion,以下总结摘自effective C++:算法sort、stable_sort、partial_sort和nth_element需要随机访问迭代器,所以它们可能只能用于vector、string、deque和数组。对标准关联容器排序元素
2013-10-09 17:01:15
774
转载 线段树(segment tree)
原文出处:http://www.cnblogs.com/shuaiwhu/archive/2012/04/22/2464583.html线段树(segment tree)线段树在一些acm题目中经常见到,这种数据结构主要应用在计算几何和地理信息系统中。下图就为一个线段树:(PS:可能你见过线段树的不同表示方式,但是都大同小异,根据自己的需要来建就行。)1.线段树基本
2013-10-08 12:35:20
511
转载 一致性哈希
原文地址:http://blog.csdn.net/sparkliang/article/details/5279393一致性 hash 算法( consistent hashing )张亮consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出,目前在cache 系统中应用越来越广泛;1
2013-10-08 09:18:19
489
原创 简单的字符串模式匹配
题目:在正则表达式中有通配符,如“*”可以匹配0个到多个字符,而“?”可以匹配任意一个字符。现在要求给出一段代码,判断一个包含通配符“*”和“?”的字符串是否与指定的字符串完全匹配。解析:这个也就不多说了,直接给代码好了。#include #include using namespace std;bool match(const char* src, const cha
2013-10-03 13:43:34
1171
原创 顺时针打印矩阵
题目:给定一个MxN的矩阵,按顺时针的顺序打印数组,例如如下矩阵:1 2 34 5 67 8 9按顺时针打印则为:1 2 3 6 9 8 7 4 5解析:对于这个题目,我们可以按将矩阵由外及里进行分层,每一层均由一个矩形表示,这个矩形所经过的数字,则为该层的所有数字。如以上矩阵,共有两层,第一层的数字为:1 2 3 6 9 8 7 4;而第二层的数字则只包
2013-09-30 10:40:44
801
原创 字符串切割
题目:给定一个收尾相连的字符串s,该字符串中只包含b、r、w三个字符。现在选定一个点作为分割点,从这个分割点往左开始收集字符,直到遇到第一个与已收集的字符不同的字符为止,设收集到的字符个数为left个。同样,从分割点往右开始收集字符,直到遇到与已收集的字符不同的字符为止,设收集到的字符为right个。要求返回left+right值。其中字符w可以作为b或r的任一一个字符。例如:s =
2013-09-29 21:41:44
832
原创 贪吃蛇游戏
题目: 一条贪吃的蛇在一个n*m的网格中游走,它只能从一个方格走向另一个相邻的方格,这里相邻的意思是两个方格有公共边。每个方格可以看作是一个房间,其中一些是空的,一些存放有苹果。贪吃的蛇根本不进入空的房间,而进入有苹果的房间后就可以带走所有苹果使房间成为空的。蛇从一个指定的房间出发,最终回到它的家,把一路带来的苹果存储到家中,当然,它希望带来的苹果最多。请编写程序,输入有整数n和
2013-09-29 19:26:02
972
原创 hulu2014笔试题,求字符串切割代价
题目:给定长为n的字符串,以及一串切割的位置,由于每一次切割字符串都需要拷贝字符串,因此每次切割的时候的代价均为O(n)。其中n代表字符串的长度。例如给定一个长为10的字符串以及切割位置为2、4、7.则如果我们按顺序切割时,总的代价为10+8+6=24,即第一次切割2位置处,剩余长度为8的子串;第二次切割4位置处,剩余长度为6的子串;最后一次在位置7处切割。但是最优的切割顺序是:4、2、7,这
2013-09-27 18:01:09
1705
原创 hulu2014笔试题,求朋友数
题目大意:H学生有25个同班同学(除掉他自己),这25个同学每个人的朋友数均不相同,其中朋友关系是对称的,即A是B的朋友,则B也是A的朋友。问H有多少个朋友?解析:其实这里分为两种情况来求解。1.H的25个同学的朋友数为1,2,....,25个分别不等。对于这种情况,我们首先看有25个朋友的人,他必然和每一个班级上的同学都是朋友,包括H;假设这个人是A,则此时可以看出那个只有一
2013-09-27 08:59:38
1956
原创 北京hulu笔试,按Z字形打印矩阵
题目:给定一个矩阵,按Z字形的顺序输出整个矩阵。所谓Z字形即如下所示:按如上的Z字形顺序打印这个矩阵,将会得到:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16这个序列。解法一:对于这个顺序,我们可以利用两个标识位,leftdown和righup来分别表示当遍历到[i,j]时,下一个元素是在左下方还是右上方。这里有两种特殊情况,即当目前的遍历方向为右
2013-09-26 22:49:20
2582
原创 华为2014校园招聘笔试,围棋吃子判断
题目大意:一个围棋盘的位置总共有三种状态,分别为空、白棋、黑棋,分别用0、1、2来表示。每一个位置都有上下左右四个邻居,当其邻居中有一个空格,则说明这个位置的棋子有气。当然,气是可以传递的,即只要一颗棋子它周围有气,则所有与该棋子相连的相同颜色的棋子都有气。若一个棋子的气为0,则该棋子将被吃掉。在下一个棋子时,若该棋子导致对方的某些棋子的气为0,则该将对方这些气为0的棋子吃掉,它们对应位置则需
2013-09-25 22:00:01
3982
原创 Google 2014校园招聘9月23日笔试题:Sorting
题目描述:Alex and Bob are brothers and they both enjoy reading very much. They have widely different tastes on books so they keep their own books separately. However, their father thinks it is good to p
2013-09-24 16:29:06
1664
原创 Google 2014校园招聘9月23日笔试题:Rational number tree
题目:Rational Number TreeConfused? Read the quick-start guide.Small input9 points Solve B-smallYou may try multiple times, with penalties for wrong submissions.Large input12 points You m
2013-09-24 16:09:17
1671
原创 排序算法
1.快速排序/**两头往中间扫描的快速排序*/void qsort_1(int *A, int low, int high){ if(A == NULL || low >= high) return; int pivotKey = A[low]; int i = low, j = high; while(i < j) { while(i = pivotKey) j--
2013-09-23 21:04:36
932
原创 寻找缺失的那个数
题目:给定一个大小为n的数组A[0..n-1],数组中包含0..n中的n个数,其中有一个数丢失,没有在数组中。现在假设数组中的数据只有一个fetch(i)操作,用于获取树脂第i为的bit位。要求给定一个O(n)的算法,找出缺失的那个数。分析:对于这个题目,由于我们一次只能获取数值的一个位信息。所以我们无法利用常规的方法,比如将0+1+2+..+n的和值减去数组A中所有的元素的和,或是利
2013-09-21 10:57:03
1024
原创 将一个整数的二进制表示的奇数位与偶数位交换位置
题目:如题,交换一个整数二进制表示中,奇数位相邻的偶数位交换。如n=10101010, 则交换后的值m = 01010101.解析:假设n=abcdefgh,则可以首先通过获取两个值m1和m2,其中m1 = a0c0e0g0, m2 = 0b0d0f0h,最后所求的值即为m = m1 | m2。要获取m1其实很简单,m1 = n & 0xaaaa;同理,获取m2 = n & 0x555
2013-09-18 09:25:22
1623
原创 将整数指定区间位设为指定值
题目:给定两个32为的整数N和M,并给定一个区间[i,j],其中0解析:这题考查的是对位操作的熟悉程度。对于这题,我们可以分三步走,第一步即将整数N的N[i, j]全部设为0;第二步,将M除了M[i, j]保持不变,其余位均设为0;第三步,用N=N | M即得到了最终的N值。利用这几步,便能够得到要求的结果,代码如下:#include using namespace st
2013-09-13 10:52:27
836
原创 求两个字符串的前后重叠的最长子串的长度
题目:给定两个字符串,求它们前后重叠的最长子串的长度,比如"abcde"和“cdefg”是"cde",长度为3。解析:假设两个字符串分别为P[0..n]和S[0..m],那么这个问题实际上是要求解的l1 = max{n-i+1 | P[i..n] = S[0..m-i]}以及l2 = max{m-i+1 | P[0..m-i] = S[i..m]}中更大的一个,即求解L=max{l1,
2013-09-11 09:58:45
5430
原创 求数组的最长严格递增子序列
题目:给定一个整数数组,求其最长递增子序列的长度。如对于数组[1, 0, 2, 3, 1],则其最长递增子序列有两个,分别为[0, 2, 3]和[1, 2, 3],这样对于这个数组的最长递增子序列的长度就为3。解析1:对于这一题,可以利用动态规划的思想来解决。对于数组A[0,..,n],我们用一个数组Len[1,..,n],Len[i]表示子数组A[0,..,i]中,以A[i]为尾的严
2013-09-10 11:27:29
1954
原创 排序堆栈
题目:给定一个堆栈,要求只用push,pop,peek以及isEmpty这四个成员函数对堆栈中的元素进行排序。解析:这个问题可以借助一个辅助栈来完成。排序的方法类似于插入排序,时间复杂度为O(n^2).具体细节可以参考代码。代码:public static Stack sort(Stack s) { Stack r = new Stack(); while(!s
2013-09-09 16:09:26
1793
原创 实现一个在O(1)内提供min操作的栈
题目:正如本文题目所示,要求实现一个除了push,pop之外,还提供一个在O(1)时间内给出堆栈内最小的数值的操作。解析1:对于这个问题,我们可以从堆栈节点保存的信息入手。通常堆栈的节点只保存一个数据对象,为了能够在O(1)的时间内找到堆栈内最小的值,我们可以在每个堆栈节点内保存一个min值,用于指示堆栈在该节点及其以下的所有节点中,最小的值。这样,当需要获取堆栈中目前的最小值的时候,
2013-09-09 15:46:16
901
原创 寻找带环的单链表的换的入口位置处的节点
题目:如本文题目,给定一个带环的单链表,给出一个算法求链表环的入口位置处的节点。解析:这题的解决步骤如下:1.设置一个快指针fast和一个慢指针slow,它们同时从链表头开始往后遍历,快指针每次移动两个位置,慢指针每次移动一个位置2.当快指针和慢指针相遇时,将慢指针重新指向链表头3.快指针和慢指针此时在同时移动,两个指针都一次移动一个位置,当两个指针再次相遇时,指针所指的节
2013-09-08 21:26:37
1187
原创 判断一个字符串是否为另一个字符串的旋转后的子字符串
题目:假定我们现在又一个函数isSubString(const string& str1, const string& str2)能够判断出字符串str2是否为str1的子串,那请给出一个方法能够快速的判断出一个字符串是否为另一个字符串任意旋转后的子串。此处所说的旋转指字符串的循环移位,例如字符串"ewintervi"为字符串"interview“旋转后的一个结果。解析:对于这个题目,
2013-09-08 11:23:54
1764
原创 原地旋转矩阵
题目:给定一个大小为N*N的矩阵A,如何在空间复杂度为O(1)的情况下,将矩阵顺时针旋转90度?解析:对于矩阵旋转,最容易想到的便是利用一个大小同样为N*N的临时矩阵T,将原矩阵A[i][j] 放在 T[j][n-i-1]位置处。最后将矩阵T的数据拷贝置矩阵A中,完成矩阵的旋转。但是这种方法的空间复杂度为O(N^2),不满足题目的O(1)的要求。其实仔细思考一下,我们可以知道矩阵A
2013-09-08 11:04:57
2694
原创 替换字符串中的空格
题目:用‘\20'替换字符串中的所有空格。源代码:void replaceWhiteSpace(char *str){ if(str == NULL) return; char* p = str; int count = 0; while(*p != '\0') { if(*p == ' ') count++; p++; }//while if(count
2013-09-07 21:15:42
649
转载 Visual Studio 2008 和 Windows 环境变量及如何在文件中引用环境变量
Visual Studio 2008 和 Windows 环境变量对设置 相对路径很重要,这样便于代码的移植,即使换一台计算机,代码不用更改配置,直接就能用。可以在项目的“工具”“属性页”对话框中任何接受字符串的位置使用这些宏。这些宏不区分大小写。 关于如何自己定义环境变量详见我的另一文章:http://blog.csdn.net/jtop0/article/details/757413
2013-09-07 10:24:13
1885
转载 7个例子科普CPU cache
CPU cache一直是理解计算机体系架构的重要知识点,也是并发编程设计中的技术难点,而且相关参考资料如同过江之鲫,浩瀚繁星,阅之如临深渊,味同嚼蜡,三言两语难以入门。正好网上有人推荐了微软大牛Igor Ostrovsky一篇博文《漫游处理器缓存效应》,文章不仅仅用7个最简单的源码示例就将CPU cache的原理娓娓道来,还附加图表量化分析做数学上的佐证,个人感觉这种案例教学的切入方式绝对是俺的菜
2013-09-03 17:08:55
959
原创 求数组逆序对数
题目:对于一个元素个数为n的数组A,若*A[i] > A[j],且0解析:对于这一个题目,最容易想到的方法即顺序扫描整个数组。没扫描到一个元素,则将该元素与其后面的所有元素进行比较,若后面的元素比该元素大,则找到一个逆序数。这一过程,对于数组中位置i处的元素需要与n - i - 1个元素进行比较。所以时间复杂度为O(n^2).当然对于这个题目可以利用分治法来求解。首先将数组一分
2013-09-03 16:56:47
2207
转载 海盗博弈论
海盗博弈论Charlesgao 2011-06-09 17:39海盗分金是一个非常古老的问题,在1999年《科学美国人》正式把它发表之前,已经至少流行10年了,相信很多人都有所耳闻,也知道解法。此前死理性派也对这个问题也有所 涉及 。今天我们就来回顾一下这个有意思的问题,并且在把问题推广到大规模海盗团伙后,会得出一些非常有意思的结论。 分
2013-09-03 13:05:01
1196
转载 让你立刻爱上数学的10个算术游戏
让你立刻爱上数学的10个算术游戏matrix67 2011-02-17 20:19死理性派的小编经常会被问到的一个问题:数学到底哪里有趣了,数学之美又在哪里?这篇文章精心选择了 10 个老少咸宜的算术问题,以定理、趣题甚至未解之谜等各种形式带领大家窥探数学世界的一角。不少问题背后都蕴含了深刻的数学知识,触及到数学的各个领域。希望从小数学就不及格的朋友们能够喜
2013-09-03 11:32:52
1727
转载 原地归并排序(In-place merge sort)
原文地址:http://www.cnblogs.com/daniagger/archive/2012/07/25/2608373.html 对于归并排序,我们首先想到的是它的时间复杂度为O(nlgn),空间复杂度为O(n).但事实上这O(n)的空间开销可以降至O(1),这一方法为原地归并排序.这一方法的思想如下:关键在于merge这个函数。两段递增的子数组arr[begin
2013-09-02 20:25:29
4265
1
使用gperftools分析性能生成的pdf文件没有函数调用关系
2016-06-23
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅