算法导论
locallucky
这个作者很懒,什么都没留下…
展开
-
《算法导论》第13章红黑树Java实现与详解
1. 什么是红黑树(1) 简介 在第12章中介绍了基本动态集合操作时间复杂度均为O(h)的二叉搜索树。但遗憾的是,只有当二叉搜索树高度较低时,这些集合操作才会较快;即当树的高度较高(甚至一种极端情况是树变成了1条链)时,这些集合操作并不比在链表上执行的快。 于是我们需要构建出一种“平衡”的二叉搜索树。红黑树(red-black tree)正是其中的一种。它...原创 2019-12-21 12:40:37 · 222 阅读 · 0 评论 -
《算法导论》第12章二叉搜索树Java实现
1.二叉树中的结点类Node,保存了树中一个结点的值,和它的父亲结点,左孩子结点与右孩子结点//二叉树中的结点类,保存了树中一个结点的值,和它的父亲结点,左孩子结点与右孩子结点public class Node { int key;//结点的值 Node p;//父亲结点 Node left;//左孩子结点 Node right;//右孩子结点 //添加一个构造方法,方便封装数值...原创 2019-12-18 22:27:46 · 112 阅读 · 0 评论 -
《算法导论》第15章动态规划最优二叉搜索树Java
import java.util.Scanner;public class OptimalBST { private double[] p; private double[] q; private int n; private double[][] e; private double[][] w; private int[][] root; public stati...原创 2019-12-17 13:12:01 · 792 阅读 · 0 评论 -
《算法导论》第15章动态规划最长公共子序列Java实现
首先定义一个给定序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果,其形式化定义如下:给定一个序列X = <x1,x2,..., xm>,另一个序列Z =<z1,z2,..., zk> 满足如下条件时称为X的子序列,即存在一个严格递增的X的下标序列<i1,i2,..., ik>,对于所有j = 1,2,...,k,满足xij= zj,例如,Z...原创 2019-12-17 11:53:48 · 380 阅读 · 0 评论 -
《算法导论》第15章动态规划矩阵链乘法Java
import java.util.Scanner;public class MatrixChainOrder{ private static int n; private static int[][] m = new int[100][100]; private static int[][] s = new int[100][100]; private st...原创 2019-12-17 10:23:58 · 215 阅读 · 0 评论 -
《算法导论》第16章贪心算法赫夫曼编码java实现
1.字符结点类CharNode,用于封装一个字符的值和它出现的频率CharNode.java//字符结点类,用于封装一个字符的值和它出现的频率public class CharNode { private char c; private int freq; public CharNode(char c, int freq) { this.c = c; this.freq ...原创 2019-12-17 01:18:57 · 392 阅读 · 0 评论 -
Leetcode题目分类指南(单独刷题或学习算法书籍配合使用)
Leetcode题目分类指南 笔者在学习《算法导论》同时,希望能够配合Leetcode的题目进行分类模块化练习,该分类为笔者自己根据做题学习经验,结合《算法导论》的内容,给出Leetcode题目分类。题目主要集中在Leetcode的前400题中,也包括有后面的一些经典值得刷的题。该题目分类按照算法和数据结构排版,即可供单独Leetcode刷题使用,也可以配合学习《算法导论》或者其他算法书籍...原创 2019-12-15 21:47:46 · 6944 阅读 · 2 评论 -
《算法导论》第5章两种随机化数组方法Java实现
public class RandomArray { private static int[] arrayOne = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }; private static int[] arrayTwo = new int[] { 1, 2, 3, 4, 5...原创 2019-12-14 22:58:46 · 236 阅读 · 0 评论 -
《算法导论》第9章中位数和顺序统计量Java
最小值和最大值:import java.util.Comparator;public class MiniMum { public static <T> T minimum(T[] t, Comparator<? super T> comparator) { T min = t[0]; for (int i = 1; i &...原创 2019-12-14 22:48:05 · 174 阅读 · 0 评论 -
《算法导论》第15章动态规划钢条切割问题Java实现
算法导论中讲解动态规划的一个很经典的例子,详细分析了朴素的递归、自顶向下动态规划的递归和自底向上的非递归动态规划,这三种思路之间的区别,并重构解。联系第22章:自顶向下动态规划的递归:就是子问题图的深度优先搜索自底向上的非递归动态规划:就是子问题图的逆拓扑排序代码实现:import java.util.ArrayList;import java.util.Arrays;i...原创 2019-12-14 22:12:08 · 508 阅读 · 0 评论 -
《算法导论》前两部分的排序算法总结
几个定义:1.稳定性:具有相同值的元素在输出数组中的相对次序与它们在输入数据中的相对次序相同。稳定性对带有卫星数据(除了需要排序元素外的附加元素)的元素至关重要,如对对象的排序,排序属性外要考虑副属性的先后次序。2.原址(In-place):如果输入数组中仅有常数个元素需要在排序过程中存储在数组之外,则称排序算法是原址的。...原创 2019-12-14 13:56:43 · 131 阅读 · 0 评论 -
《算法导论》第8章桶排序Java
import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.ListIterator;//桶排序,元素为[0,10)之间的实数public class BucketSort { public static void main(String[] a...原创 2019-12-14 13:36:38 · 229 阅读 · 1 评论 -
《算法导论》第2章希尔排序Java实现
import java.util.Arrays;public class ShellSort { public static void main(String[] args) { int a[] = {22,58,33,45,2,7,1,99,100}; System.out.println(Arrays.toString(a)); a=Shell_Sort(a);...原创 2019-12-14 12:52:47 · 124 阅读 · 0 评论 -
《算法导论》第2章选择排序Java实现
import java.util.Arrays;//选择排序public class SelectSort { public static void main(String[] args) { int[] a= {11,32,25,65,72,33,89,14,500,1,250}; System.out.println(Arrays.toString(a)); a=sel...原创 2019-12-14 12:50:59 · 80 阅读 · 0 评论 -
《算法导论》第2章冒泡排序Java实现
基础的排序之一import java.util.Arrays;public class BubblePopSort { public static void main(String[] args) { int[] a= {11,32,25,65,72,33,89,14,500,1,250}; System.out.println(Arrays.toString(a));...原创 2019-12-14 12:49:20 · 92 阅读 · 0 评论 -
《算法导论》第8章基数排序Java实现
前面的计数排序是基数排序的基础,思想是按照多个关键字(桶)对元素进行多轮的计数排序例如对三位数排序时,首先根据个位数进行计数排序,然后十位数,最后根据百分数,最后得到有序的序列import java.util.Arrays;//基数排序,以对三位数为例public class RadixSort { public static void main(String[] args) ...原创 2019-12-14 12:21:02 · 115 阅读 · 0 评论 -
《算法导论》第8章计数排序Java代码实现
//计数排序public class CountintSort { public static void main(String[] args) { int[] arr = {2,5,3,0,2,3,0,3}; System.out.println("数组arr为:"); for(int i:arr) { System.out.print(i+" "); } Sy...原创 2019-12-14 11:02:34 · 125 阅读 · 0 评论 -
《算法导论》第2章插入排序和归并排序Java代码实现
算法导论开始引入的两个最基本和经典的算法,用Java把伪代码实现了一遍,慢慢踩坑,动手一步步实现算法导论中和课后习题的代码。插入排序:public class InsertSort { //插入排序 public static int[] Insert_Sort(int[] a) { int key = 0; int i=0; for(int j=1;j<a.le...原创 2019-12-13 22:59:15 · 156 阅读 · 0 评论 -
《算法导论》第4章最大子数组Java实现
一个数组的最大子数组是指该数组的一个和最大的子数组最大子数组有三种分布情况: 1 最大子数组完全在数组的左半部 2 最大子数组完全在数组的右半部 3 最大子数组跨越数组的中间分布在左右半部,该情况又可分为1 2 3三种子情况其中前两种分布情况是和主问题相同的子问题,可以使用递归分治去解决,而第三种情况和主问题形式不同,需要考虑继续拆分为三...原创 2019-12-13 22:33:19 · 156 阅读 · 0 评论 -
《算法导论》第7章快速排序随机化版本Java实现
import java.util.Random;//快速排序的随机化版本,每次随机选取切分元素(主元)public class RandomQuickSort { public static void main(String[] args) { int a[] = {99,32,5,4,101,265,322,45,1,3}; a=Random_Quick_Sort(a)...原创 2019-12-13 22:17:24 · 142 阅读 · 0 评论 -
《算法导论》第7章快速排序Java代码实现
//快速排序,选取右边界元素为切分元素public class QuickSort { /* public static void main(String[] args) { int a[] = {99,32,5,4,101,265,322,45,1,3}; a=Quick_Sort(a); for(int i:a) { System.out.print(i+" ");...原创 2019-12-13 22:15:20 · 125 阅读 · 0 评论 -
《算法导论》第6章优先队列Java代码实现
最大优先队列类为://基于堆结构的最大值优先的优先队列public class MaxPrimaryQueue<Key extends Comparable<Key>>{ //用于保存堆的元素 private Key[] pq; //用于保存堆中目前存在的元素个数 private int heapsize=0; //构造方法,创建制定大小的优先队列...原创 2019-12-13 19:55:32 · 134 阅读 · 0 评论 -
《算法导论》第6章堆排序Java代码实现
//堆排序,数组下标从1开始为有效元素,a[0]为哨兵public class HeapSort { public static void main(String[] args) { int a[]= {1,3,5,9,2,4}; int[] b=HeapSort.HeapSort(a); for(int i:b) { System.out.print(i+" ");...原创 2019-12-13 18:48:51 · 143 阅读 · 0 评论