摘要:
贪心算法问题: 活动安排: 见《算法导论》一书P238.对于活动的安排问题理解:.由知Aij表示在活动i的开始后,活动j结束前的活动安排。则由知Aij=Aik+ak+Akj.由知 Aik表示在活动i结束后,活动k开始前的活动数。 Akj表示在活动k结束后,活动j开始前的活动数。因此... 阅读全文
摘要:
算法导论 16.1-4题(多个教室活动选择的问题): CLRS 16.1-3 假设要用很多个教室对一组活动进行调度。我们希望使用尽可能少的教室来调度所有的活动。请给出一个有效的贪心算法,来确定哪一个活动应使用哪一个教室。来源: http://blog.csdn.net/heyongluoyao8/article/details/69341... 阅读全文
摘要:
贪心算法的原理与设计 贪心算法的设计步骤 1、将最优化问题转化为这样的形式:对其做出一次选择后,只剩下一个子问题要求解。 这个问题可以引用前面得到的活动选择问题进行说明 ,如在活动选择问题中,设Aij 代表的是活动ai 结束后开始,且在aj结束之前进的一个子问题,于是 ... 阅读全文
摘要:
背包问题 对于0-1背包问题,由于我们对一个商品只有两种选择:要或者不要。于是我们的背包问题不是一个贪心算法问题,很简单 如果选用贪心算法,我们肯定是决定选用“商品单位重量价值最高“,如下面的例子则相反了如上图中有3种商品的价值以及重量,背包容量为50.那么如果选用贪心算法,则商品1的单位重量价值最高为60/10=6.而商品2和商品3的分别为100/20和120/30... 阅读全文
摘要:
背包问题(二维数组解法)参考文章: http://www.cnblogs.com/Anker/archive/2013/05/04/3059070.html 对于背包问题的解答又冒出一个新的解法,这是一种自顶向下的解法: 设一个二维数组select[i][v]表示的是,将前i个物品放入到容量为v的背包中所能得到的最大价值。如果使用递归的算法 如何使这人问题转换为多个子问题呢,也就... 阅读全文
摘要:
0-1背包问题优化关于0-1背包问题的优化,其实一开始也觉得分配的内存确实太多了,对于物品数为N,背包容量为W的背包问题则我们每次需要分配的内存是N*W,这确实不太好。于是我们是否可以使用一个一维数组来代替前面算法的二维数组问题呢? 这好像是可以的,因为我们的想法是自底向上,其实对于W*N的二维数组,对于数组select[i][w]所代表的意思是在背包容量为w,可以选的物品为前i个时它所能达到的最... 阅读全文
摘要:
散列表又叫哈希表,它是为了减少搜索空间,但又考虑到时间上设立的。 http://codeplayer.org/2013/11/210 参考网页#include #include #define m 17//#define HASH(k) k % m //除法散列法 #define A 0.85//#define HASH(k)... 阅读全文
摘要:
堆排序算法原理 堆排序算法,就是利用二叉树的原理,我们知道,对于二叉树而言,具有一定的排序性质: 如 左节点是小于根节点的值,右节点的值肯定是大于根节点的值的,因此, 我们算是快能找到某一个元素 因为如果当前元素比要找的元素要大,那么就往右走,如果当前元素比要找的元素要小,那么往右找,呵呵,相 信如何树上存在这号元素的话,应该很快就能找到... 阅读全文
摘要:
#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... 阅读全文
摘要:
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... 阅读全文
摘要:
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; } } }}上面的希尔排序很简单:... 阅读全文
摘要:
#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... 阅读全文
摘要:
#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... 阅读全文
摘要:
#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]... 阅读全文
摘要:
归并排序是分治算法的一个典型的体现: 将原问题分解为若干的子问题进行求解就可以了。分治算法的步步骤:归并排序的步骤:第2-4行将原问题分成子问题,第5行将这些子问题进行合并。原代码:#ifndef MERGE_SORT_H#define MERGE_SORT_Hvoid mergeArr(int left,int mid,int right,int *arr); void mergeSort... 阅读全文
摘要:
钢条切割问题的两种解法#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... 阅读全文
摘要:
在动态规划问题中,我们经常会遇到以下问题,最优解倒是求出来了,但是最优解的路径呢?如何输出?这确实是一个问题,而且往往比较难哟。。我这里说的路径是指,像在钢条切割问题中,从哪些地方切可以达到最优化,在矩阵链乘问题中,从哪些地方进行组合可以使效率最高?在钢条切割问题中:for(j=1;jprice){ pathStore[i]=j; //意思为使是长度为i的钢条价格达到最优,需要从第j个位置进... 阅读全文
摘要:
矩阵链乘的优化问题产生的原因: 如图,对于矩阵的链乘时,我们可以采用不同的组合进行相乘当然不同的组合会产生不同的效率。不同的组合所产生的效率如下:上面表达式的意思是,对于一个从Ai乘到Aj的矩阵链乘运算,我们可以将问题进行划分为两个子问题如下:从Ai 乘到Ak的效率代价加上Ak+1到Aj的代价,再加上(呵呵,最要的问题)它们两者的结果相乘的代价。代码如下: #includ... 阅读全文
摘要:
最大公共子序列问题:就是两个字符串相似的最大子符长度!!!。这个问题关键还是在于把子问题与原问题的桥梁求出来:如上式中,当xi =yj 于是就有否则:于是结合以上两种情况便可得出代码:#ifndef MAX_LENGTHCOMMSUBSTR_H#define MAX_LENGTHCOMMSUBSTR_H#define max(a,b) a>b? a:bint maxLengthComSubSTR(... 阅读全文
摘要:
#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... 阅读全文