- 博客(145)
- 资源 (3)
- 收藏
- 关注
原创 拓扑排序
//bfs and dfs#include#includeusing namespace std;#define N 10#define WHITE 0#define GRAY 1#define BLACK 2int time ;struct Edge{ Edge* next; int start ; int end ; int weight; Edge(int
2013-08-25 20:37:06
408
原创 单链表转置
#includeusing namespace std;class Node{public: Node* next; int key; Node(int k):key(k){ next = NULL; }};class List{public: Node* head; int num; List(int n):num(n){ head = NULL; }
2013-08-25 15:25:44
494
原创 算法导论图的表示
#includeusing namespace std;#define N 10struct Edge{ Edge* next; int start ; int end ; int weight; Edge(int s,int e):start(s),end(e){ weight = 1; next = NULL; }};struct Vext{ Edge* hea
2013-08-19 09:08:06
397
转载 大端小端
在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。目前在各种体系的计算机中通常采用的字节存储机制主要有两种:big-edian和little-endian。 字节顺序 Endia
2013-08-08 12:53:05
356
转载 一致性哈希
一致性 hash 算法( consistent hashing )张亮consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出,目前在 cache 系统中应用越来越广泛;1 基本场景比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N
2013-07-23 20:27:24
328
转载 基于用户投票的排名算法(六):贝叶斯平均
作者: 阮一峰日期: 2012年3月28日(这个系列实在拖得太久,今天是最后一篇。)上一篇介绍了"威尔逊区间",它解决了投票人数过少、导致结果不可信的问题。举例来说,如果只有2个人投票,"威尔逊区间"的下限值会将赞成票的比例大幅拉低。这样做固然保证了排名的可信性,但也带来了另一个问题:排行榜前列总是那些票数最多的项目,新项目或者冷门的项目,很难有出头机会,排
2013-07-23 08:55:24
309
转载 基于用户投票的排名算法(四):牛顿冷却定律
作者: 阮一峰日期: 2012年3月16日这个系列的前三篇,介绍了Hacker News,Reddit和Stack Overflow的排名算法。今天,讨论一个更一般的数学模型。这个系列的每篇文章,都是可以分开读的。但是,为了保证所有人都在同一页上,我再说一下,到目前为止,我们用不同方法,企图解决的都是同一个问题:根据用户的投票,决定最近一段时间内的"热文
2013-07-23 08:51:26
344
转载 基于用户投票的排名算法(三):Stack Overflow
作者: 阮一峰日期: 2012年3月11日上一篇文章,我介绍了Reddit的排名算法。它的特点是,用户可以投赞成票,也可以投反对票。也就是说,除了时间因素以外,只要考虑两个变量就够了。但是,还有一些特定用途的网站,必须考虑更多的因素。世界排名第一的程序员问答社区Stack Overflow,就是这样一个网站。你在上面提出各种关于编程的问题,等
2013-07-23 08:48:20
341
转载 基于用户投票的排名算法(二):Reddit
上一次,我介绍了Hacker News的排名算法。它的特点是用户只能投赞成票,但是很多网站还允许用户投反对票。就是说,除了好评以外,你还可以给某篇文章差评。Reddit是美国最大的网上社区,它的每个帖子前面都有向上和向下的箭头,分别表示"赞成"和"反对"。用户点击进行投票,Reddit根据投票结果,计算出最新的"热点文章排行榜"。怎样才能将赞成票和反对票结合起来,计算出一段
2013-07-23 08:43:57
311
转载 随机抽样(蓄水池)
问题起源于编程珠玑Column 12中的题目10,其描述如下: How could you select one of n objects at random, where you see the objects sequentially but you do not know the value of n beforehand? For concreteness, how would
2013-07-05 09:03:30
304
转载 posix线程中的内存泄露
POSIX 线程简介使用线程的主要原因是要提高程序性能。线程的创建和管理只需要较小的操作系统开销和较少的系统资源。一个进程内的所有线程共享相同的地址空间,使得线程间的通信更高效,且比进程间通信更易于实现。例如,如果一个线程在等待一个输入/输出系统调用完成,其他线程可以处理 CPU 密集型任务。通过线程,可以优先调度重要任务 — 甚至中断 — 低优先级任务。可将偶尔发生的任务放在定期调度的任
2013-07-04 10:05:17
315
原创 找硬币(dp)
/*总和为n分的硬币而言,具有k种的找零的硬币(d1,d2,,...,dk),希望找到一种算法可以在O(kn)时间内找到具体思路:使用dp的思想,我们假设是对于总和是j分的硬币,对应的数量是c[j],那么的话,当j是小于等于0的时候的话就是c[j]=0;j是非0的时候,相应的可以使用一种动态规划的思想,获取得到一种最优子结构,第一次找到di类钱找零,下一次进行的话就是最小的c[j]所以对应
2013-07-03 22:23:10
421
原创 贪心算法
/*贪心算法:例子1.活动选择问题: 问题描述:一系列活动,对于其中的活动ai来说的话对应的起始和终止的时间段求的是对于这些活动如果按照结束时间的升序列进行排序的话,求的让活动出现兼容的最大活动; 定义某一个集合S[i,j]表示的是存在一个活动ak使得下面式子满足{si<=sk<fk<=fj},那么的话存在的是下面的情况。相应情况见书本;*/#include #include
2013-07-03 16:33:48
331
原创 高效调度
/* 问题描述:n个作业,对于任意一个作业aj对应的时间涉及到三个值:处理时间tj,效益pj,最后期限dj,那么在一个时间段内只能做一件事情而且是要连续的情况下才可以完成,即要连续执行tj时间才可以,此外如果是在dj之前完成的话就可以获得pj,如果完成不了的话就没有这个pj; 思路:这是一个典型的背包问题0-1背包,那么先把背包问题做过介绍,背包问题是dp的典型例子,参考dd_engi的>的
2013-07-03 10:50:33
359
转载 背包问题
— Tanky Woo(2010.07.31)首先说下动态规划,动态规划这东西就和递归一样,只能找局部关系,若想全部列出来,是很难的,比如汉诺塔。你可以说先把除最后一层的其他所有层都移动到2,再把最后一层移动到3,最后再把其余的从2移动到3,这是一个直观的关系,但是想列举出来是很难的,也许当层数n=3时还可以模拟下,再大一些就不可能了,所以,诸如递归,动态规划之类的,不能细想,
2013-06-30 22:53:10
322
原创 棋盘移动
/*计划聚会:问题描述:就是对于一个公司而言的话形成的管理体系是如下的情况:以总裁为根的一棵树,之后往下进行扩展,分左子树以及右子树,现在要求的是每一层的每一个节点都有一个对聚会的喜欢程度,但是限制条件是雇员和他的直接上司是不可以同时参加的,现在就是求这个的期望总和是最大的情况; 解法:我们对于某一层的一个节点进行讨论,如果该节点参加的话,把这个节点涂色为红色,不参加的话涂色为白色,对应
2013-06-30 22:28:42
379
原创 编辑距离
/*编辑距离:问题介绍:对于编辑距离的问题基本上是对于序列Xi,转换为序列Yj,这个过程的话可以涉及到中间序列Z,包含的操作有插入,删除,替换,复制,交换,终止对于各个的操作步骤不在解释,可参见算法导论p218,对应介绍,这里给定的一个定义就是编辑距离的定义:如何让从序列Xi到Yj的转换的开销变得最小; 思路:转换的开销我们记做c[i][j],表示从Xi到Yj 的开销。我们可以认为的话对
2013-06-30 16:41:34
329
原创 十五章整齐打印
/*整齐打印:问题描述: n个单词,对应的长度是,每一行最多是M个字符,如果对于一行来说的话,从i开始到j位置终止的话(i<j),单词之间只留一个空格,则对于每一行来说的话会在行末尾留下的最多的空格是e[i][j]=M-j+i-(k从i到j求和)lk;但是如果是最后一行的话,就不算进去行末尾空格的数量,相应的我们需要的代价是在行末尾的空格的次数的立方后的求和之值是最小。 求解思路:由
2013-06-30 10:43:11
308
原创 算法导论十五章课后习题15.1 双调欧几里得旅行商问题
/* 双调欧几里得旅行商问题:首先需要明确的是欧几里得旅行商问题是np完全的,是不可以在多项式的时间复杂度内完成的,那么的话为了能够可以解决这个问题,就由某人提出了双调欧几里得旅行商方法,把时间复杂度降到了O(n^2),下面是求解思路: 思路:在平面中对于点序列,我们根据其x左边进行排序,从左往右是升序,相应的定义一个双调路径pi,j,这个双调序列是包含了所有的上述序列的,具体的双调序
2013-06-28 21:03:51
515
转载 左旋转字符串
第一章、左旋转字符串作者:July,yansha。时间:二零一一年四月十四日。微博:http://weibo.com/julyweibo。出处:http://blog.csdn.net/v_JULY_v。-------------------------------------------目录序前言第一节、左旋转字符串
2013-06-23 22:47:34
337
转载 高性能服务器
高性能服务器必须考虑的4个方面:1 数据拷贝2 内存管理3 进程/线程上下文切换4 锁争用说明:以下文章中会包含一些研究服务器性能的链接,这些链接也是非常重要的文档,本文不再列出,查看下面的文章内容时,可点击文章里面的链接访问。影响服务器性能的TCP选项:TCP_CORK,TCP_NODELAYhttp://bbs.net130.com/showthread
2013-06-23 14:21:20
380
原创 算法导论第十五章复习
持续更新...15.1:来一个例子:装配线调度,主要是找到最有子结构,注意的是找到之后的解决方法,不能够通过给出的式子直接的进行操作,那样的话会造成求解的过程时间复杂度很高,但是使用顺序求解就是O(n)完成,代码如下;/**动态规划之装配线调度**/#include using namespace std;#define N 6class cost{public: int f
2013-06-22 10:46:36
345
原创 算法导论复习十四章
//持续更新#include //动态顺序统计,要分析好对于新添加的信息size在插入,删除以及旋转的时候的变换,直接从这种变化出发进行解决是最好的,也可以采用一种修正后的调整就是插入之后再进行调整之类#define RED 1#define BLACK 0using namespace std;struct node{ int key; node* p; node* left;
2013-06-21 20:12:55
337
原创 算法导论十三章复习
/*红黑树:一种二叉查找树,某种程度上也是一种平衡树,其中平衡树还有avl树。红黑树:对于红黑树的而言,首先是一个二叉查找树,此外每一个节点包含的还有一项技术指标就是每个节点还有一个表示该节点颜色的项目,节点要么是红色要么是黑色,为了限制红黑树的平衡型,通过使各个分支上的红黑的着色方式达到一种近似的平衡,所以红黑树算是一种平衡树,类似的平衡树还有:avl树,treap树;红黑树的特性:(1
2013-06-21 13:13:18
488
原创 C语言库函数实现
C语言库函数实现,备忘。#include#include#includeusing namespace std;int Strlen(const char* string){ int leng=0; for (int i=0;string[i]!='\0';++i) { ++leng; } return leng;}char* Strcpy(char* dst,cons
2013-05-24 12:21:03
349
原创 算法导论十二章复习
/*二叉查找树,查找算法里面的一种,折半查找的时间复杂度是O(nlgn)二叉查找树:可以进行的操作是:插入,删除,查找,最大值,最小值。对于有n个节点的二叉查找树来说的话,树的高度是O(lgn),那么进行一次的查找的时间复杂度也就是O(lgn)*/#include using namespace std;struct node{ int key;//其他卫星数据亦可包含; nod
2013-05-22 10:15:10
397
原创 算法导论散列表(哈希)
/*哈希的操作有插入,删除,查找,把某一键值K映射到对应的槽里面,通过的是哈希函数,一般情况下的槽的规模设为m,容易出现的一种情况就是叫做地址冲突即不同的键值,通过一个哈希函数,映射到槽中的某一相同的位置;一般的哈希方法有:直接哈希:hash(k)=k||a*k+b;(a,b为常数);乘法哈希:hash(k)=m*( (k*A) mod 1)其中A的值见算法导论;除法哈希:hash(k
2013-05-13 22:17:05
398
原创 链表
#include using namespace std;/*对于链表的话,单链表和双向链表,算法导论里面是按照双向链表来进行的,且是无序的。 *//****************无哨兵的情况**********************/struct node{ node* prev; node* next; int key; node(int k):key(k),prev
2013-05-13 21:52:59
281
原创 算法导论第十章10.1复习
/*栈,队列,二叉树;栈的基本操作:对于插入,删除操作叫做,(PUSH压入)以及(POP弹出),对于栈的话是先进后出,而队列的话是先进先出,对于队列的话具体操作有(入队列ENQUEUE)以及(出队列DEQUEUE)*//***************栈操作*****************************/#include using namespace std;class
2013-05-13 20:52:36
362
原创 算法导论复习第九章
/*算法导论第九章,中位数和顺序统计。9.1 第i个顺序统计的意思是集合中第i个小的元素,对于n个数,当为奇数的时候中位数就是指第(n+1)/2的那个数,当是偶数的时候就是有两个中位数,包括上中位数(n+1)/2(向上取整),以及(n+1)/2(向下取整),对于n个数中求最大值或者最小值一般情况下的话,需要的是n-1个次比较,对于求最大也求最小的话,需要比较的次数是2(n-1)次;但是也有一
2013-05-13 16:27:05
400
转载 Epoll在LT和ET模式下的读写方式
在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK)从字面上看, 意思是:EAGAIN: 再试一次,EWOULDBLOCK: 如果这是一个阻塞socket, 操作将被block,perror输出: Resource temporarily unavailable总结:这个错误表示资源暂
2013-05-08 21:23:20
286
原创 杨氏矩阵
具体结构介绍可以参考《算法导论》第六章,课后习题6-3.杨氏矩阵操作有的时候有点像二叉搜索树,有的时候类似堆排序,操作:#include #include using namespace std;#include#includeusing namespace std;#define m 4#define n 5void findk(int (*a)[n],int key){
2013-04-10 08:41:15
352
原创 排序汇总
//各种排序总结:直接插入排序,折半插入,希尔排序,快速排序,选择排序,冒泡排序,堆排序,归并排序//稳定性:直接插入排序,折半插入排序,冒泡排序归并排序是稳定的,希尔排序,快速排序不稳定,对于选择排序,每一次都要那样的执行,和序列的组成元素无关//时间复杂度:O(n^2),O(n^2),O的一点几次幂,O(nlog2n),o(n^2),O(n^2),O(nlog2n),O(nlog2n)
2013-03-29 15:42:40
324
原创 LINUX环境下read细节
对于read和write操作而言是无缓冲的操作,我们从文件读取的时候(终端也是一样,因为文件描述符0,1,2分别表示),对于该read而言的话只有在遇到EOF(ctrl+D)的时候才会读取终止,相应的进行返回,而对于\n而言(ENTER)是不会造成终端的读取终止,而相应的该字符是当做一个描述符进行操作的,而且每一次对一个字符串进行填写的话,会把之前的部分给覆盖掉,且机器不会再给你添加一个\n,见下
2013-03-25 11:19:29
372
原创 大数相乘
大数相乘主要就是指那些数字太大,超出long等字符型的界限范围,那么的话对于这种情况我们可以使用字符串,数组(字符数组省空间),进行相应的表示,那么的话就相应的应该可以得到最终的表示结果,对于这种大数相乘的话,个人感觉有3点要注意的,第一就是对于每个大数使用数组表示之后相应的规律,第二就是对于相乘之后的进位,第三就是对于处理大数的时候,我们应该从大数的个位开始考虑进位,但是对应的用数组表示的话就是
2013-03-20 21:28:12
1568
原创 KMP
KMP算法:主要参考严蔚敏数据结构,最主要理解的就是一点:对于主串和子串,主串是长的,子串是短的,在主串中某个位置开始找子串匹配的起始位置;关键的难解决以及理解的一点就是对于子串而言每一个位置上相应的会出现从最开始到该位置的一个小子串,对于该小子串而言从开始到小子串中某一位(假设有n位)和从该小子串末尾往前算(n位)相对应位置上字符是相等的,现在对于子串的每一位就是先要求得该n(0到某一小于当
2013-03-08 20:26:15
350
转载 深入VC流(虽然讲的悔死VC的流和c++标准库的流基本一样的)备忘
深入VC流 “流”是VC的一大特色。依靠强大的流类库可以方便简洁的实现数据的输入输出,相信熟悉VC的用户一定深有感触。 “流”是一是十分抽象的概念,尽管很多资料都对其有定义,但都没有把这个概念讲透,用抽象的语言来描述抽象的概念结果必定是模糊的。而且不难发现这么一个现象,无论是基础的VC教程还是高层程序开发的资料,一旦涉及“流”都是从如何在实践编程中应用的角度来描述,我个人觉得有
2013-01-04 16:45:13
364
原创 sizeof,size,length,strlen,对于c风格字符串和string操作
c风格字符串:"sdsadsa"有下面2中方式:char* p="sdsdsd";cahr p[]="sdsdsds";后面这种实际上在某种情况下是可以作为字符数组的缩写的;char p[]={'','','',};即后面这种表达方式甚至是后面这种表达方式的实际情况都是可以这么认为的:在具体的语境的情况下:当使用strlen的时候,把他当做是字符串常量进行操作,但是当为定义数组的时候就
2012-12-29 17:05:08
906
原创 每对顶点间的最短路径2
#include#define N 10using namespace std;int min(int x,int y){ return x<y? x:y;}struct weight{ int value[N][N];};struct graph{ friend struct weight; int vex; int edge; weight wt; weig
2012-12-25 22:29:00
267
原创 每对顶点最短路径(1)
#include#define N 10using namespace std;int min(int x,int y){ return x<y? x:y ;}struct weight{ int v[N][N];};struct graph{ friend struct weight; int vex; int edge;// int* p[N][N]; wei
2012-12-25 22:16:17
269
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人