![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
ALosterN1H
这个作者很懒,什么都没留下…
展开
-
利用哈夫曼压缩文件
package com.jason.huffman;import java.io.*;import java.util.*;import java.util.zip.ZipOutputStream;public class HuffmanCodesDemo { public static void main(String[] args) {// String str = "iiii loveeee youuuuu";// byte[] zipArr = .原创 2020-06-21 11:50:51 · 125 阅读 · 0 评论 -
最长不重复子串
public class LongestUnrepeatedString { public static void main(String[] args) { System.out.println(getLUS("abcdeb")); System.out.println(getLUS("abcde")); System.out.println(getLUS("abcarcbh")); } public static Strin.原创 2020-06-17 19:33:51 · 102 阅读 · 0 评论 -
分治算法
分治算法汉诺塔:现在A柱子上有三个盘子,如果A柱子只有一个盘子就好了(解决)我们就可以直接把盘子从A拿到C;于是乎,萌生了一个想法,我们可以把1,2,3号盘子看成只有两部分组成,即 (1,2)-----3 (分解) 然后把(1,2)从A移动到B,再把3移动到C,最后把(1,2)从B移动到C。现在的问题又变成了如何把1,2号盘子移动到B,其实步骤还是和上面一样,我们可以继续分解,分成1, 2号盘子(它们现在都是独立的),然后先把1号盘子从A移动到C,再把2号盘子从A移动到B,最后把1号盘子从C移动到B原创 2020-06-16 20:39:26 · 109 阅读 · 0 评论 -
哈希表
哈希表例子:现在需要插入N个数字,然后用哈希表实现;思路:可以先建一个数组,大小是10;然后判断新加入元素的个位数的值当然了上面举了一个很简单的例子,实际中也不会只采用大小为10的数组,因为如果数据量很多,就难以避免链子会很长。所以选择哪个数字作为数组的大小就尤其重要。假设当前数组大小为S,加入的数大小为W,那么该数要加入到数组的下标为L; 公式: L = W % S, 这样可以保证L一定小于S,就不会导致越界问题。综合举例:校长代码:在这里插入代码片...原创 2020-06-16 16:41:31 · 267 阅读 · 0 评论 -
斐波那契查找算法
斐波那契查找算法斐波那契查找与二分查找差不多,区别在于 二分查找的mid 使用除法算出来,而斐波那契查找的mid是用加减法算出来的,计算机对于 加减法的处理速度快于除法,尤其是在大数据量以及单个数值很大时尤其明显。待排数组元素个数一定要是斐波那契数,如果不是我们就强行加长数组,多的空间用原待排数组的最后一个元素填充。 /* 使用fibonacci查找算法的目的: Fibonacci查找算法其实本质上就是二分查找算法 只不过二分查找算法求mid时,用的是除原创 2020-06-14 22:54:18 · 457 阅读 · 0 评论 -
插值查找算法
插值查找算法二分查找:1 2 3 4 5 6 7 8 9…1000000000;需要查找元素1的下标,结果要查询log2 1000000000 次。这是耗时的,而插值查找算法则可以快速定位插值查找 与 二分查找主要区别 就是 mid取值的不同二分:mid = (left + right) / 2插值:mid = left + (right-left) * (findVal - arr[left])/(arr[right]-arr[left]); public static List<I原创 2020-06-14 20:49:33 · 77 阅读 · 0 评论 -
二分查找
二分查找 --递归 public static List<Integer> half(int[] arr,int left,int right,int findVal){ //如果查找元素小于一个,直接返回空 if (left > right){ return null; } //以中间元素为查找对象 int mid = (left+right)/2;原创 2020-06-14 20:34:04 · 85 阅读 · 0 评论 -
八大排序之堆排序
堆排序堆有分大顶堆和小顶堆,其中大顶堆的意思父结点总是比其子结点大,小顶堆的意思父结点总是比其子结点小。如果是升序就用大顶堆,降序就用小顶堆对于升序来说,堆排序第一步就要把一颗树转换成大顶堆转化成大顶堆的方法:从最后一个非叶子结点开始一直到头结点为止,要把这些个结点的子结点小于它们即可;即:第二步:我们已经知道该大顶堆的第一个结点的值肯定是最大的,所以我们就把第一个结点的值与最后一个结点的值进行交换,然后继续检查第一个结点的子结点是否大于其左右子结点,很明显肯定不是的;所以就交换父子结点,然后原创 2020-06-14 18:13:42 · 269 阅读 · 0 评论 -
八大排序之桶排序
桶排序因为一个十进制数,个位或者十位或者百位或者…上的可能取值有十种情况,分别是0~9,所以有10个桶,每个桶里面之所有分8层,是因为上面的例子有8个数需要排序第一轮后:第一轮是根据个位数的值放入桶的。然后再按从左到右,从上到下的顺序把桶里的值依次赋值到原数组中,得:210,100,200,10,23,326,8,99第二轮:第三轮:至此已经排序完毕public static void Bucketsort(int[] arr){ //十进制即十个桶原创 2020-06-14 16:19:59 · 183 阅读 · 1 评论 -
八大排序之快速排序
快速排序 //arr:待排数组,left:待排数组最左小标,right:待排数组最右下标 public static void quick(int[] arr,int left,int right){ int mid=(left+right)/2; int l=left; int r=right; int pivot=arr[mid];//以中间的元素为基准,进行比较 //左右指针不能越界原创 2020-06-14 13:38:31 · 84 阅读 · 0 评论 -
八大排序之归并排序
归并排序核心:先拆后合不多逼逼,直接上图看完图,肯定已经明白一大部分了。 //该方法是:拆 ------- arr:待排数组,left:第一个元素下标,right:最后一个元素下标,temp:临时数组 public static void divide(int[] arr,int left,int right,int[] temp){ //如果不止一个元素就拆 if (left < right){ //往中间一刀切原创 2020-06-14 10:54:10 · 86 阅读 · 0 评论 -
八大排序之希尔排序
希尔排序学希尔排序之前,必须要有插入排序算法的基础插入排序算法:八大排序之插入排序可以这么说,希尔排序就是对插入排序的优化为什么这么说呢?场景:2,3,4,5,6 ,1现在轮到把 1 插入到正确的位置上, 很明显肯定是插在第一位,即:1 2 3 4 5 6,但是可以看出要比较5次,虽然5次并不多,但是在大数据量的情况下,这个比较次数就有些恐怖了;这时希尔排序横空出世,其算法思路很简单,即:不再像插入排序一样,一个一个的往前的比较;而是跨距离比较。上面的例子:2,3,4,5,6 ,1思路:原创 2020-06-13 23:26:21 · 121 阅读 · 0 评论 -
八大排序之插入排序
插入排序要求:现在有ABCDE五个盒子,现在需要把它们按照从小到大的排序插入排序算法思路:第一轮:从B开始往前比较,如果B大于A,则直接下一轮,反之,交换AB第二轮:从C开始往前比较,如果C大于B,直接下一轮,不用再去比较C,A的大小,因为如果C大于B,则C一定大于A(因为B大于A);如果C小于B,那么首先用一个变量K把C的值先保存起来,然后再把B的值赋给C;如果C还小于A,那就将A的值赋给B,最后把K值赋给A,如果C大于A,那就将K值赋给B;第三轮:……如果有N个数,那么就需要N-1轮,因原创 2020-06-13 21:33:28 · 275 阅读 · 0 评论 -
八大排序之选择排序
选择排序要求:将上面的三个盒子从小到大排序;选择排序算法思路:第一轮,选出第一小的盒子,放在第一个位置上第二轮,选出第二小的盒子,放在第二个位置上……所以:有N个数,就需要N-1轮,每一轮中需要比较N-K次,其中K代表第K轮 public static void Select(int[] arr){ for (int i=0;i<arr.length-1;i++){ int minIndex=i;原创 2020-06-13 19:57:06 · 99 阅读 · 0 评论 -
八大排序之冒泡排序
冒泡排序假设现在有三个盒子(分别为A,B,C),每个盒子里各有一个数字,现在需要根据盒子里面的数字,按照从小到大的顺序,将盒子的摆放到正确的位置上即:冒泡算法:先比较第一个盒子与第二个盒子的大小,如果第一个盒子小于第二个盒子,那么不用做任何操作;如果第一个盒子大于第二个盒子,那么交换这两个盒子;接着进行比较第二个盒子与第三个盒子,步骤也和上面的一样;当我们比较完第一轮之后就可以把最大的盒子放在最后一位;接着第二轮也可以第二大的数,放在倒数第二位…所以如果有N个数需要排序,我们只需要(N-1)轮原创 2020-06-13 19:18:42 · 143 阅读 · 0 评论