算法
来杯茶的ni
因学习而年轻,因年轻而快乐
展开
-
算法--排序--堆与堆排序
一、用数组表示堆堆其实是一棵完全二叉树,那么用数组表示如下:i位置的左子树位置为2*i+1; i位置的右子树位置为2*i+2; i位置的父节点位置为(i-1)/2;二、大根堆在完全二叉树中任何一棵子树的最大值都在根部创建大根堆public void creat(int[] arr){ for (int i = 0; i < arr.length; i++) { heapInsert(arr, i); } }public static void h原创 2020-05-28 17:50:31 · 155 阅读 · 0 评论 -
算法--排序--快速排序
问题引入:代码:public static int[] partition(int[] arr, int l, int r, int p) { int less = l - 1; int more = r + 1; while (l < more) { if (arr[l] < p) { swap(arr, ++less, l++); } else if (arr[l] > p) { swap(arr, --more, l); }原创 2020-05-28 16:03:13 · 194 阅读 · 0 评论 -
算法--查询--插值查找
思想:根据要查找的关键字与查找表中最大最小记录的关键字比较后的查找方法,其核心在于插值计算公式mid=low+(key-a[low])/(a[high]-a[low])*(high-low)public int Find(int key, int a[]) { int low,high,mid; low=0; high=a.length-1;...原创 2019-10-16 00:26:53 · 178 阅读 · 0 评论 -
算法--查询--折半查找
又称为二分查找前提:线性表的记录必须是关键码有序,线性表必须采用顺序存储。思想:在有序表中,取中间记录为比较对象,如果相同则查找成功;若给定值小于中间记录的关键字,则在中间记录左边继续查找;若给定值大于中间记录的关键字,则在中间记录右边继续查找。不断重复上述过程,直到查找成功,或查找区域无位置,查找失败为止。public int Find(int key, int a[]) { ...原创 2019-10-16 00:24:52 · 142 阅读 · 0 评论 -
算法--查询--顺序表查找
顺序查找又叫线性查找思想:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,若相等,则查找成功;如果到最后一个(或第一个)都不相等,则查找失败。public int Find(int key, int a[]) { for(int i=0;i<a.length;i++){ if(a[i]==key){ ...原创 2019-10-16 00:23:04 · 187 阅读 · 0 评论 -
贪心算法
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。...原创 2019-09-16 21:34:11 · 96 阅读 · 0 评论 -
自底向上与自顶向下(递归与动态规划)
从子问题解决原问题, 无非是两种方法,自底向上(Bottom-Up)与自顶向下(Top-Down),形式上前者对应iteration,利用循环将结果存在数组里,从数组起始位置向后计算;后者对应recursion,即利用函数调用自身实现。如果不存储上一个状态的解,则为递归,否则就是DP。举个斐波那契数列(0,1,1,2,3,5…)的例子:1) 自底向上int array[n] = {0};...原创 2019-09-13 17:08:49 · 16917 阅读 · 3 评论 -
递归与动态规划的异同
递归和动态编程(Dynamic Programming, DP)是算法类问题中的难点所在。算法的核心在于找到状态转移方程,即如何通过子问题解决原问题。相似递归和动态编程能解决的问题都有一个特性:原问题(problem)可以分解成若干个子问题(sub-problem),只有先解决了子问题才能进一步解决原问题。子问题的解决方式形式上与原问题一致。区别DP和递归有什么不同?最大的区别在于...原创 2019-09-13 16:58:26 · 2093 阅读 · 0 评论 -
什么是动态规划
动态规划(英语:Dynamic programming,简称 DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题...原创 2019-09-13 16:47:25 · 1600 阅读 · 0 评论