摘要: 贪心算法问题: 活动安排: 见《算法导论》一书P238.对于活动的安排问题理解:.由知Aij表示在活动i的开始后,活动j结束前的活动安排。则由知Aij=Aik+ak+Akj.由知 Aik表示在活动i结束后,活动k开始前的活动数。 Akj表示在活动k结束后,活动j开始前的活动数。因此... 阅读全文
posted @ 2015-07-17 20:02 yml435 阅读(274) 评论(0) 推荐(0)
摘要: 算法导论 16.1-4题(多个教室活动选择的问题): CLRS 16.1-3 假设要用很多个教室对一组活动进行调度。我们希望使用尽可能少的教室来调度所有的活动。请给出一个有效的贪心算法,来确定哪一个活动应使用哪一个教室。来源: http://blog.csdn.net/heyongluoyao8/article/details/69341... 阅读全文
posted @ 2015-07-17 20:01 yml435 阅读(1185) 评论(0) 推荐(0)
摘要: 贪心算法的原理与设计 贪心算法的设计步骤 1、将最优化问题转化为这样的形式:对其做出一次选择后,只剩下一个子问题要求解。 这个问题可以引用前面得到的活动选择问题进行说明 ,如在活动选择问题中,设Aij 代表的是活动ai​ 结束后开始,且在aj结束之前进的一个子问题,于是 ... 阅读全文
posted @ 2015-07-17 20:00 yml435 阅读(434) 评论(0) 推荐(0)
摘要: 背包问题 对于0-1背包问题,由于我们对一个商品只有两种选择:要或者不要。于是我们的背包问题不是一个贪心算法问题,很简单 如果选用贪心算法,我们肯定是决定选用“商品单位重量价值最高“,如下面的例子则相反了如上图中有3种商品的价值以及重量,背包容量为50.那么如果选用贪心算法,则商品1的单位重量价值最高为60/10=6.而商品2和商品3的分别为100/20和120/30... 阅读全文
posted @ 2015-07-17 19:59 yml435 阅读(208) 评论(0) 推荐(0)
摘要: 背包问题(二维数组解法)参考文章: http://www.cnblogs.com/Anker/archive/2013/05/04/3059070.html 对于背包问题的解答又冒出一个新的解法,这是一种自顶向下的解法: 设一个二维数组select[i][v]表示的是,将前i个物品放入到容量为v的背包中所能得到的最大价值。如果使用递归的算法 如何使这人问题转换为多个子问题呢,也就... 阅读全文
posted @ 2015-07-17 19:58 yml435 阅读(307) 评论(0) 推荐(0)
摘要: 0-1背包问题优化关于0-1背包问题的优化,其实一开始也觉得分配的内存确实太多了,对于物品数为N,背包容量为W的背包问题则我们每次需要分配的内存是N*W,这确实不太好。于是我们是否可以使用一个一维数组来代替前面算法的二维数组问题呢? 这好像是可以的,因为我们的想法是自底向上,其实对于W*N的二维数组,对于数组select[i][w]所代表的意思是在背包容量为w,可以选的物品为前i个时它所能达到的最... 阅读全文
posted @ 2015-07-17 19:57 yml435 阅读(407) 评论(0) 推荐(0)
摘要: 散列表又叫哈希表,它是为了减少搜索空间,但又考虑到时间上设立的。 http://codeplayer.org/2013/11/210 参考网页#include #include #define m 17//#define HASH(k) k % m //除法散列法 #define A 0.85//#define HASH(k)... 阅读全文
posted @ 2015-07-17 19:56 yml435 阅读(269) 评论(0) 推荐(0)
摘要: 堆排序算法原理 堆排序算法,就是利用二叉树的原理,我们知道,对于二叉树而言,具有一定的排序性质: 如 左节点是小于根节点的值,右节点的值肯定是大于根节点的值的,因此, 我们算是快能找到某一个元素 因为如果当前元素比要找的元素要大,那么就往右走,如果当前元素比要找的元素要小,那么往右找,呵呵,相 信如何树上存在这号元素的话,应该很快就能找到... 阅读全文
posted @ 2015-07-17 19:55 yml435 阅读(243) 评论(0) 推荐(0)
摘要: #ifndef HEAP_SORT_H#define HEAP_SROT_H#includevoid maxHeap(int *arr,unsigned int Length); void maxHeap(int *arr,unsigned int rootIndex,unsigned int heapSize);void builMaxHeap( int *arr,unsigned int he... 阅读全文
posted @ 2015-07-17 19:54 yml435 阅读(173) 评论(0) 推荐(0)
摘要: http://developer.51cto.com/art/201403/430986.htm这里唯一的注释就是为什么要先 从右边开始 即:while(arr[j]>=temp&&i=temp&&iright){ return ; } int i=left; int j=right; int temp=arr[left]; while(i!=j){ while(arr[j]>=tem... 阅读全文
posted @ 2015-07-17 19:53 yml435 阅读(187) 评论(0) 推荐(0)
摘要: void shellSort(int *arr,int Length){ int temp; for(int gap=Length/2; gap>0;gap/=2){ for(int i=0;i=0&&arr[k]>temp){ arr[k+gap]=arr[k]; k-=gap; } arr[k+gap]=temp; } } }}上面的希尔排序很简单:... 阅读全文
posted @ 2015-07-17 19:52 yml435 阅读(122) 评论(0) 推荐(0)
摘要: #include#includevoid insertSort(int *arr,unsigned int Length); void insertSortMy(int *arr,unsigned int Length); void insertSort(int *arr,unsigned int Length){ for(int iter=1; iter=0&&arr[i]>temp){ a... 阅读全文
posted @ 2015-07-17 19:51 yml435 阅读(164) 评论(0) 推荐(0)
摘要: #ifndef BUBBLING_INSERT_H[#define BUBBLING_INSERT_Hvoid bubblingInsert(int *arr,int Length); void bubblingInsert(int *arr,int Length){ int temp; for(int i=0;iarr[j+1]){ temp=arr[j]; arr[j]=arr... 阅读全文
posted @ 2015-07-17 19:50 yml435 阅读(128) 评论(0) 推荐(0)
摘要: #ifndef SELECT_SORT_H#define SELECT_SORT_Hvoid selectSort(int *arr,int Length); void selectSort(int *arr,int Length){ int min,temp; for(int i=0;iarr[j]){ min=j; } } if(min!=i){ temp=arr[min]... 阅读全文
posted @ 2015-07-17 19:49 yml435 阅读(120) 评论(0) 推荐(0)
摘要: 归并排序是分治算法的一个典型的体现: 将原问题分解为若干的子问题进行求解就可以了。分治算法的步步骤:归并排序的步骤:第2-4行将原问题分成子问题,第5行将这些子问题进行合并。原代码:#ifndef MERGE_SORT_H#define MERGE_SORT_Hvoid mergeArr(int left,int mid,int right,int *arr); void mergeSort... 阅读全文
posted @ 2015-07-17 19:48 yml435 阅读(158) 评论(0) 推荐(0)
摘要: 钢条切割问题的两种解法#ifndef IRON_CUT_PRB_H#define IRON_CUT_RPB_H#include int ironCutPrb(int *ironPrice,int Length); //这个是基于递规逄法的int ironCutPrb_optimize(int *ironPrice,int Length); //这个是基于双层循环的。#endif #include... 阅读全文
posted @ 2015-07-17 19:47 yml435 阅读(315) 评论(0) 推荐(0)
摘要: 在动态规划问题中,我们经常会遇到以下问题,最优解倒是求出来了,但是最优解的路径呢?如何输出?这确实是一个问题,而且往往比较难哟。。我这里说的路径是指,像在钢条切割问题中,从哪些地方切可以达到最优化,在矩阵链乘问题中,从哪些地方进行组合可以使效率最高?在钢条切割问题中:for(j=1;jprice){ pathStore[i]=j; //意思为使是长度为i的钢条价格达到最优,需要从第j个位置进... 阅读全文
posted @ 2015-07-17 19:46 yml435 阅读(1420) 评论(0) 推荐(0)
摘要: 矩阵链乘的优化问题产生的原因: 如图,对于矩阵的链乘时,我们可以采用不同的组合进行相乘当然不同的组合会产生不同的效率。不同的组合所产生的效率如下:上面表达式的意思是,对于一个从Ai​乘到A​j​的矩阵链乘运算,我们可以将问题进行划分为两个子问题如下:从A​i 乘到Ak的效率代价加上A​k+1​到Aj​的代价,再加上(呵呵,最要的问题)它们两者的结果相乘的代价。代码如下: #includ... 阅读全文
posted @ 2015-07-17 19:45 yml435 阅读(168) 评论(0) 推荐(0)
摘要: 最大公共子序列问题:就是两个字符串相似的最大子符长度!!!。这个问题关键还是在于把子问题与原问题的桥梁求出来:如上式中,当xi =yj 于是就有否则:于是结合以上两种情况便可得出代码:#ifndef MAX_LENGTHCOMMSUBSTR_H#define MAX_LENGTHCOMMSUBSTR_H#define max(a,b) a>b? a:bint maxLengthComSubSTR(... 阅读全文
posted @ 2015-07-17 19:44 yml435 阅读(127) 评论(0) 推荐(0)
摘要: #ifndef LONG_PATH_H#define LONG_PATH_H#include#include#define MAX 65535int graphPath_longest(int (*Graph)[5],int Length,int origin,int destin ); void printf_path(int origin,int destin); #endif #i... 阅读全文
posted @ 2015-07-17 19:43 yml435 阅读(1104) 评论(0) 推荐(0)
摘要: #ifndef PALINDROME_H_#define PALINDROME_H_#include#includeint palindrome_longest(char *str,int front,int back); #endif #include"Palindrome.h"#define Max(a,b) a>b? a:b int palindrome_longest(char *str,... 阅读全文
posted @ 2015-07-17 19:42 yml435 阅读(200) 评论(0) 推荐(0)
摘要: 对于最优化的子数组问题,一名话,就是从给你的数组中寻找一个子数组,使得它的和是最优的(最大/最小)假如求最大子数组: 如果数组中元素全是正的,那么好办,整个数组的和就是了。 如果数组中元素全是负的,那么也好办,找最小的那个。 但是如果正负相间呢???如上图中,如何求出那个最大的子数组呢?显然我们可以穷举,但是... 阅读全文
posted @ 2015-07-17 19:41 yml435 阅读(237) 评论(0) 推荐(0)
摘要: 硬币找零&&爬楼梯&&猴子摘香蕉 假设有几种硬币,如1、3、5,并且数量无限。请找出能够组成某个数目的找零所使用最少的硬币数。 #include"CoinProblem.h"#includeint countNum=MAX;void CoinProblem(int *coin,int Length,int Value,int count){ if(Value==0){ if(countNum>c... 阅读全文
posted @ 2015-07-17 19:40 yml435 阅读(319) 评论(0) 推荐(0)
摘要: 装配线问题: 韩鸡鸡一直强调的装配线问题其实很简单,也算是动态规划里面比较简单的问题了。在上面的图中,我们可以看到也就是一个车间有两条装配线,每一个相对位置的功能是相同的。。如图中a11和a21,它们的功能是相同的,都是装配一个零件,但是它们所需的时间却不相同。而且不同装配线间的移动是要花时间的。但是在同一条装配线上移动是不需要花时间的,当然了,我们只能从左往右依次装配零件。那么问题来了,怎... 阅读全文
posted @ 2015-07-17 19:39 yml435 阅读(593) 评论(0) 推荐(0)
摘要: 来自为知笔记(Wiz)附件列表 阅读全文
posted @ 2015-07-17 19:36 yml435 阅读(95) 评论(0) 推荐(0)
摘要: 来自为知笔记(Wiz) 阅读全文
posted @ 2015-07-17 19:34 yml435 阅读(83) 评论(0) 推荐(0)
摘要: 虚拟存储器 虚拟存储器是一个抽象概念,它为进程提供了一种假象,每一个进程都象独占了占主存一样。 每个进程看到的是一致的存储器,称为虚拟地址空间。 程序代码和数据: 对于所有进程来说,代码是从同一固定地址开始,紧接着是和C全局变量相对应的数据位置。堆: 运行时堆,可以收缩和扩张,如在使用malloc 和free时。栈: 编译器用它来实现函数调用 来自为知笔记(Wiz... 阅读全文
posted @ 2015-07-17 19:34 yml435 阅读(125) 评论(0) 推荐(0)
摘要: 源代码#ifndef SEARCHDATA_TWODIMENSION_H#define SEARCHDATA_TWODIMENSION_H#includeint searchData_TwoBinaryArray(int *arr,int lineNum,int columnNum ,int searchData){ int columnIndex=columnNum-1; int lineIn... 阅读全文
posted @ 2015-07-17 19:33 yml435 阅读(142) 评论(0) 推荐(0)
摘要: 开始看这个题目的时候,还真觉得他娘的高大上啊。其实呢,都是些噱头!!!!!两种方法: 1、用栈实现 2、既然能想到栈,那么递归也能想到吧比较两种方法: 比较这两种方法而言,其实用栈的方法好些,对于递归这种方法,如果链表过长,(我们知道,对于子函数的调用,是通过不断地在主函数体后面的空间中组织新的栈空间),因此可能会导致栈的溢出。用栈实现:#ifndef LIST_INSERTR... 阅读全文
posted @ 2015-07-17 19:31 yml435 阅读(174) 评论(0) 推荐(0)
摘要: 二叉树的建立:对于二叉树,如果单纯通过前序遍历或后序遍历以及中序遍历是无法唯一确定一棵二叉树的前序+中序后序+中序才可以唯一确定一棵二叉树。因此我们可以通过前序+中序或者后序+中序的结果对二叉树进行确定。假设一棵二叉树为如下:则前序和中序遍历的结果是:我们首先要对前序遍历和中序遍历的特点进行了解。如上图数组中,明显可以看到。在前序遍历中,数组第一个元素就是这棵树的Root,而中序遍历,则Root位... 阅读全文
posted @ 2015-07-17 19:30 yml435 阅读(213) 评论(0) 推荐(0)
摘要: 直观地想,如果想得到倒数第k 个节点,那么从后面往前数k个啰?这个不行,单向链表是行不通的,那么也可以这样,设有n个节点,那么向前往后数n-k+1个吧。但是这种方法要两次遍历链表,第一次是获得链表节点的个数n.第二次才找到倒数第k个节点。比较巧的方法是: 设两个指针,一个指各头,另一个与前一个指针相隔k-1个节点,则当后面那个指针指向尾的时候,前面那个就指向了倒数第k个节点了。注意代... 阅读全文
posted @ 2015-07-17 19:29 yml435 阅读(172) 评论(0) 推荐(0)
摘要: 这个题目,其实考的是栈的本质问题,也就是它的压入和弹出的顺序。首先我们分析题目中所给的那几个例子,也就是数据的压入顺序是1、2、3、4、5。但是弹出的顺序是4、5、3、2、1。这个好办啦,猜都能猜到它是如何操作的。我们直观上看是这样,但是实际上,给你一个压入数组,一个弹出的数组,如何去判断它的正确性呢?其实我们可以根据这两个数组进行分析:从上面可以看到,首先弹出的是4,因此栈顶肯定是4啦,但是此时... 阅读全文
posted @ 2015-07-17 19:28 yml435 阅读(374) 评论(0) 推荐(0)
摘要: 新的解决方案:#ifndef COMPLEX_LISTCLONE_H#define COMPLEX_LISTCLONE_H#includestruct ComplexListNode{ int m_nValue; struct ComplexListNode *m_pNext; struct ComplexListNode *m_pSibling; }; ComplexListNode *co... 阅读全文
posted @ 2015-07-17 19:27 yml435 阅读(156) 评论(0) 推荐(0)
摘要: 给定一棵二叉树如下: 这个题目一看就很简单嘛,因为这棵二叉树是比较正规的二叉树,因此这棵树的遍历的话如果采用中序遍历,那么正好就是想要的那个链表的序列嘛。但是如何将它们链起来呢?其实也很单嘛。我们只要将原来中序遍历用来打印的那个地方不断地添加到链表的队尾就可以了啊。但是这个问题还是难了我不少时间,操。。。没想到会先传入一个链表啊源代码:#ifndef TREE_TOULIST_H#defin... 阅读全文
posted @ 2015-07-17 19:26 yml435 阅读(1945) 评论(0) 推荐(0)
摘要: 写这个的目的在于,说明快速排序的灵活运用。我们来看下关于快速排序中的一部分关键代码:快速排序代码:int a[101],n;//定义全局变量,这两个变量需要在子函数中使用 void quicksort(int left,int right) { int i,j,t,temp; if(left>right) return; ... 阅读全文
posted @ 2015-07-17 19:25 yml435 阅读(319) 评论(0) 推荐(0)
摘要: 这个问题关键在于好好分析一些样例如:给定123这个数,你说这个从1到123所有数字中,1出现的次数是多少?首先我们要分析个位上1出现的次数,我们看看什么情况下个位出现1:1,11,21,31,41,-----91,101,111,121,因为从1-123中其实就是有多少个十就行了。你看下从1到100个位出现1的情况:1,11,21,31,41,51,------91。有多少个呢?就是10*1=10... 阅读全文
posted @ 2015-07-17 19:24 yml435 阅读(358) 评论(0) 推荐(0)
摘要: 我的代码:直接用了以前那个求二叉树某一个条路径的和为特定值的思想源代码struct TreeNode{ int val; struct TreeNode *left; struct TreeNode *right; }; #ifndef BINARY_TREE_DEEP_H#define BINARY_TREE_DEEP_H#include "reconstructBinaryTree.h... 阅读全文
posted @ 2015-07-17 19:23 yml435 阅读(298) 评论(0) 推荐(0)
摘要: 这个题目如果没有限制你的时间复杂度,那么它的在O(n2) 里面完成的话, 那么就很简单 了。但是如果发求你在O(n)的时间复杂度里面完成。那么这还是有点挑战性的。题目的分析:对于逆序对的理解先看方法:如上面的所示,对于该算法以,我们首先将数组划分成一个一个的数字(为了排序),然后拆分成了两个己排好序的数组。那么如何计数逆序对呢?如上图在(a)图中:是两个排好序的数组,一个是5,7,另一个是4,6.... 阅读全文
posted @ 2015-07-17 19:23 yml435 阅读(672) 评论(0) 推荐(0)
摘要: 这个题目的思想是,书上说,由于题目中说了是其它的数字有两个,而这两个数字只有一个,于是知:异或(不知道你有没有想到)。解题的思路是: 先对数组中所有数字进行一次异或 int bitXORResult=0; for(int i=0;i>1; } return shiftCount; }找到bitXORResult中从最后开始最近一位是1的下标。然后就根这个标志分成两组。那么这两个只出... 阅读全文
posted @ 2015-07-17 19:22 yml435 阅读(340) 评论(0) 推荐(0)
摘要: 其实这个题目如果没有限制时间复杂度的话,那么就很简单了,一遍一遍地扫描吧。时间复杂度肯定就是O(n2)啰。但是这题目肯定不会这么简单,否则就是小学生的水平了嘛。其实我刚到这题的时候想到的是用二叉查找的方法进行。但是可能有点困难。书上提供的方法固然是很巧妙的。我们要抓住题目中数组的特点,是排好序的。我们先定义两个指针。一个指头,一个指尾。我们来计算start+end=16>15。于是知大了,... 阅读全文
posted @ 2015-07-17 19:22 yml435 阅读(326) 评论(0) 推荐(0)
摘要: 控制终端: 当用户自举时,会创建init进程,进程号为1. init的创建使系统进入多用户状态。对于每个允许登录的设备,intit进程用一次fork,它所生成的子进程则执行exec(getty)程序。然后login程序将执行以下操作 : 1、将当前的工作目录设为用户的起始目录(chdir) 2、调用chown改变终端的用户所有权,使登录用户成为它的所有者。 3、将该终端设备... 阅读全文
posted @ 2015-07-17 19:21 yml435 阅读(292) 评论(0) 推荐(0)
摘要: 进程 进程的两个基本要素:程序代码和数据集 当创建系统为一个进程的显式请求创建一个进程时叫做进程派生。进程的五状态阻塞:如果进程请求了它必须等待的某些事件,则进入阴塞状态。也就是说正在运行的程序请求调用操作系统中一部分代码所发生的过程。如进程可以请求操作系统的一个服务,但是这个服务没法立刻响应。上图中多了一个挂起态,这是为节约内存的资源,将一部分阻塞的资源存入到硬盘中,进入挂起态。这里... 阅读全文
posted @ 2015-07-17 19:21 yml435 阅读(216) 评论(0) 推荐(0)
摘要: 关于指针的几个思考 1、对于指针数组 char *A[3]; long *B[3]; 那么它们占的空间是多大?答案当然是4*3=12个字节啰,其实以前没怎么思考这些问题, 因为在计算机系统里面指针占用4个字节的大小。当然是不管你多少个字节。 附:对于 char **C[3]... 阅读全文
posted @ 2015-07-17 19:20 yml435 阅读(246) 评论(0) 推荐(0)
摘要: 函数传指针与引用 由于在今天编程的时候遇到一个小小的问题,这个问是虽然小,但是闲扰了我一整天的时间------注意,是一整天! 废话不多说,先给出一段代码 // 二叉树的建立.cpp : 定义控制台应用程序的入口点。//#include using namespace std;//定义二叉排序树的节点typedef struct Node{ int data; ... 阅读全文
posted @ 2015-07-17 19:19 yml435 阅读(337) 评论(0) 推荐(0)
摘要: 数组指针: 首先看名字“数组指针”是“指针”,那就可以当作指针理解啰。但是前面有数组,也就是它指向的是数组。 看-》 int (*p)[10], 我们从表达式分析,因为()的优先级高,于是*p代表p是指针,又int 修饰的是[10]表示 一个含有10个int型的数组,于是p代表的是含有10个元素的数组的首地址。 也许该这么定义数组指针: int (*)[10... 阅读全文
posted @ 2015-07-17 19:19 yml435 阅读(149) 评论(0) 推荐(0)
摘要: 来自为知笔记(Wiz) 阅读全文
posted @ 2015-07-17 19:19 yml435 阅读(123) 评论(0) 推荐(0)
摘要: unsigned int的表示今天在写堆排序的时候遇到一个BUGvoid builMaxHeap( int *arr,unsigned int heapSize){ unsigned int i; for(i=heapSize/2-1; i>=0;--i){ std::cout=0;--i){上面换句话说就是如果 i 是负数就退出循环吧,可惜啊,对于无符号类型 i 是 永完取不到负数啊 !!!... 阅读全文
posted @ 2015-07-17 19:17 yml435 阅读(215) 评论(0) 推荐(0)
摘要: 本文介绍C/C++中堆,栈及静态数据区。 五大内存分区 在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。下面分别来介绍: 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一... 阅读全文
posted @ 2015-07-17 19:17 yml435 阅读(511) 评论(0) 推荐(0)
摘要: BUG:今天我写了一个很SB的代码,这个问题其实我早己注意到,在以前写这样的代码的时候,我也留了个心眼,但可能是很长时间不写这些东西导致新问题的产生。其实这个问题我以前也写过笔记,现在再写一下加深印象。先附代码:#ifndef LIST_INSERTREMOVEPRINT_H#define LIST_INSERTREMOVEPRINT_H#includestruct ListNode{ int v... 阅读全文
posted @ 2015-07-17 19:16 yml435 阅读(249) 评论(0) 推荐(0)
摘要: 守护进程是一种生命周期较长的进程,它常在系统自举时开始,然后在系统关闭是结束。 #include"unpipc.h"int main(){ int i,fd0,fd1,fd2; pid_t pid; struct rlimit rl; struct sigaction sa; umask(0); if(getrlimit(RLIMIT_NOFILE,&rl)<0){ sys_err... 阅读全文
posted @ 2015-07-17 19:15 yml435 阅读(195) 评论(0) 推荐(0)