
数据结构与算法
贵沫末
这个作者很懒,什么都没留下…
展开
-
数据结构与算法——平衡二叉树
文章目录平衡二叉树AVL的定义左旋图解右旋图解双旋图解代码实现平衡二叉树 学习过了二叉查找树,想必大家有遇到一个问题。例如,将一个数组{1,2,3,4}依次插入树的时候,形成了图1的情况。有建立树与没建立树对于数据的增删查改已经没有了任何帮助,反而增添了维护的成本。而只有建立的树如图2,才能够最大地体现二叉树的优点。AVL的定义平衡二叉查找树:简称平衡二叉树。由前苏联的数学家Adelse-Velskil和Landis在1962年提出的高度平衡的原创 2021-04-24 18:41:27 · 66 阅读 · 1 评论 -
数据结构与算法——二叉排序树
二叉排序树什么是二叉查找树:根节点的值大于其左子树中任意一个节点的值,小于其右节点中任意一节点的值,这一规则适用于二叉查找树中的每一个节点。本文章重点来讨论一下关于二叉查找树删除节点的问题。有一下二叉查找树,如图:package com.gykalc.binarysorttree;/** * 二叉排序树: * 每次添加元素时,从根节点开始进行比较,大的放在右边,小的放左边,一直向下直到节点为空时, * 将元素插入到其位置 * 删除元素的步骤: * 1、找到要删除的元原创 2021-04-19 16:46:45 · 37 阅读 · 1 评论 -
数据结构与算法——哈夫曼编码
哈夫曼编码 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。哈夫曼编码,主要目的是根据使用频率来最大化节省字符(编码)的存储空间。哈夫曼编码和解码代码实现package com.gykalc.huffmancode原创 2021-04-18 22:57:02 · 68 阅读 · 0 评论 -
数据结构与算法——赫夫曼树图解与代码实现
赫夫曼树图解与代码实现构建赫夫曼树package com.gykalc.tree;import java.util.ArrayList;import java.util.Collections;import java.util.List;/** * 哈夫曼树: * 树的带权路径最小的二叉树,也就是最优二叉树,也称为哈夫曼树 * wpl(weighted path length):(每个节点的权值 * 路径长度)的和,wpl最小时称为哈夫曼树 */public class原创 2021-04-17 16:59:29 · 67 阅读 · 0 评论 -
数据结构与算法——堆排序代码实现
堆排序代码实现package com.gykalc.tree;import java.util.Arrays;/** * 堆排序: * 利用堆这个数据结构,进行排序。 * 堆:它是一个完全二叉树,它的每个节点如果都大于或等于左右子节点,则称为大顶堆 * 它的每个节点如果都小于等于左右子节点,则称为小顶堆,一般我们使用数组来模拟堆 * 完全二叉树中,第n个节点的左右节点下标为:左节点下标(2n + 1)、右节点下标(2n + 2) */public class HeapSort {原创 2021-04-17 15:58:17 · 39 阅读 · 0 评论 -
数据结构与算法——线索二叉树
线索二叉树package com.gykalc.tree;public class ThreadedBinaryTreeDemo {}/** * 线索二叉树: * 通过之前的学习,我们知道,二叉树可以使用数组实现,那是顺序存储二叉树 * 第n个节点的下标为n(n从0开始),第n个节点的左子节点为2n + 1,第n个节点的右子节点为2n + 2 * 第n个节点的父节点为 (n - 1) / 2 * <p> * 二叉树还可以使用二叉链表来实现,但是二叉链表中,整个二叉链表存原创 2021-04-12 00:26:52 · 40 阅读 · 0 评论 -
数据结构与算法——树结构
树结构一、为什么需要树结构数组存储方式分析优点:通过下标访问元素,速度快,访问有序数组使用二分查找、插值查找、斐波拉契查找法查找效率高缺点:插入、删除元素,导致数组会整体移动,效率较低链表存储方式分析优点:插入、删除元素效率比较高缺点:查询某个具体的元素需要遍历整个链表树结构存储方式分析能提高数据存储和读取的效率,例如使用二叉排序树(Binary Sort Tree)既可以保证数据的检索速度,也可以保证数据的插入、删除、修改速度二、树中的常用术语三、二叉树四、原创 2021-04-11 01:50:06 · 48 阅读 · 0 评论 -
数据结构与算法——哈希表
哈希表代码实现package com.gykalc.hashtable;import java.util.Iterator;/** * 哈希表:是一种数据结构 * 存入的数据与数组的下标是通过一个hash函数得出的,即hash(value)得到存放的数组的位置 * 但是hash(value)不能保证所有不同的value,得出的下标都不一样,这就是hash冲突的问题 * 如何避免hash冲突呢?就是我们数组中存放的是一个链表,当两个值得到一样的下标,那么就 * 使用链表存放这些值,原创 2021-04-10 09:56:36 · 33 阅读 · 0 评论 -
数据结构与算法——斐波拉契查找法
斐波拉契查找法这里我不知道为什么其他的斐波拉契算法都要扩充数组,我们仅仅移动下标不可以吗?下面是我自己写的斐波拉契算法Java版本package com.gykalc.find;import java.util.ArrayList;/** * 斐波拉契查找法: * 它也要求数组是有序的 * 根插值查找、二分查找类似,只是改变中间值的查找方式 * 中间值查找方式为:mid = left + F(k-1) - 1 * 推导公式:假设要查找的数组长度为一个斐波拉契数 F(k) - 1原创 2021-04-08 10:44:26 · 34 阅读 · 0 评论 -
数据结构与算法——二分查找法和插值查找法代码实现
文章目录二分查找法插值查找法二分查找法package com.gykalc.find;public class BinarySearch { public static void main(String[] args) { int[] arr = {1,3,5,7,9,11,13,15,22,31}; System.out.println(binarySearch(arr, 0, arr.length, 10)); } /** *原创 2021-04-07 22:28:43 · 37 阅读 · 0 评论 -
数据结构与算法——常用排序方法对比
常用排序方法对比原创 2021-04-07 21:03:53 · 32 阅读 · 0 评论 -
数据结构与算法——基数排序与桶排序
基数排序与桶排序代码实现package com.gykalc.sort;import java.util.Arrays;import java.util.function.Consumer;import java.util.function.Function;/** * 桶排序: * 当有一个无序整数数组,我们知道他的长度和最大值的范围 * 这时,我们就可以创建一个最大值长度的桶,用无序整数数组中的整数作下标 * 有相同的值就将桶中该下标的值+1,最后取出来的值就是排完序的数组原创 2021-04-07 20:58:54 · 39 阅读 · 1 评论 -
Centos配置网络
一、插入网线后,查看那个网卡被激活了使用命令ifconfig -a看所有网卡的信息<UP,BROADCAST,MULTICAST>里面如果有RUNNING,那么就说明这块网卡激活了,插上了网线如果没有RUNNING说明没有激活二、设置动态IPvi /etc/sysconfig/network-scripts/ifcfg-网卡名...原创 2021-04-07 15:44:08 · 436 阅读 · 1 评论 -
数据结构与算法——归并排序代码实现
归并排序代码实现一、归并排序图解二、代码实现package com.gykalc.jdk8.sort;/** * 归并排序: * 分:首先将数组拆分成一个个的数据,这是一个递归拆分的过程 * 归:拆分之后再一个个合并为一个个的有序数组,最后合并为一个有序数组 */public class MergeSort { public static void main(String[] args) { int size = 800000; int[] ar原创 2021-04-05 02:13:10 · 41 阅读 · 1 评论 -
数据结构与算法——快速排序代码实现
快速排序代码实现package com.gykalc.jdk8.sort;import java.util.Arrays;/** * 快速排序:现在有一个数组arr = [30, 40, 60, 10, 20, 50] * 首先找到一个基准值,我们假设基准值为x = arr[0] = 30; * 我们找到两个点分别指向最低位和最高位low = 0; high = arr.lenth - 1; * 我们首先判断arr[high]即高位上的数应该放在基准值的左边还是右边 * 因为x原创 2021-04-04 22:36:48 · 37 阅读 · 1 评论 -
数据结构与算法——希尔排序分析
希尔排序分析package com.atgyk.sort;import java.util.Arrays;public class AppendSort { public static void main(String[] args) { int size = 80000; int[] arr = new int[size]; for (int i = 0; i < size; i++) { arr[i] = (原创 2021-04-03 22:46:54 · 31 阅读 · 1 评论 -
数据结构与算法——插入排序代码实现
插入排序代码实现package com.gykalc.sort;import java.util.Random;/** * 插入排序法,将一个集合看成一个有序集合和一个无序集合 * 第一次时:有序集合里面只有一个元素,无序集合里有n - 1个元素 * 插入:判断大小,插入到合适的位置,一直循环,直到全部插入为止 */public class AppendSort { public static void main(String[] args) { Random原创 2021-04-02 16:37:33 · 49 阅读 · 1 评论 -
数据结构与算法——冒泡排序以及优化
冒泡排序以及优化package com.gykalc.sort;import java.util.Arrays;public class bubbleSort { public static void main(String[] args) { int[] arr = new int[]{-1, -2, 9, 5, 10, 6, 4, 7, 8, 11, 12, 13}; int[] head = headBubbleSort(arr); i原创 2021-04-02 14:24:15 · 34 阅读 · 1 评论 -
数据结构与算法——使用递归解出八皇后所有解法
使用递归解出八皇后所有解法package com.gykalc.recursion;/** * 八皇后问题: * 在 8 * 8 的棋盘上, * 任意两个皇后不能存在在同一斜线、同一排、同一列的摆法有多少种 */public class EightQueen { // 统计八皇后问题的所有解法 public static int jieCount = 0; public static void main(String[] args) { // 创建八皇原创 2021-04-02 10:52:10 · 33 阅读 · 0 评论 -
数据结构与算法——逆波兰表达式(后缀表达式)计算器实现
逆波兰表达式(后缀表达式)计算器实现之前,我们使用中缀表达式实现了计算器的功能,但是,我们发现了,该功能特别复杂,中缀表达式不利于计算机的逻辑实现前缀表达式 例如:(3+4)*5-6,这是一个典型的中缀表达式,适合人类阅读,转换成前缀表达式为:- * + 6 5 4 3,前缀表达式是从右往左进行扫描,遇到数字就压入栈中,遇到操作符,就弹出栈顶元素和次栈顶元素,进行运算。后缀表达式(逆波兰表达式)原创 2021-03-31 14:39:04 · 108 阅读 · 0 评论 -
数据结构与算法——使用自定义栈完成计算器算法
使用自定义栈完成计算器算法package com.gykalc.jdk8.stack;import java.util.ArrayList;import java.util.Arrays;import java.util.Optional;/** * 使用自定义的栈,来计算一个字符串表达式的值 * 例如:15*10+1 */public class MyArrayStackDemo { public static void main(String[] args) throws原创 2021-03-30 23:35:13 · 30 阅读 · 0 评论 -
数据结构与算法——使用数组实现栈
使用数组实现栈package com.gykalc.stack;import java.util.Arrays;public class MyArrayStackDemo { public static void main(String[] args) throws Exception { MyArrayStack<Integer> myArrayStack = new MyArrayStack<>(5); myArrayStack.p原创 2021-03-30 16:50:19 · 29 阅读 · 0 评论 -
数据结构与算法——单向环形链表解决约瑟夫问题
单向环形链表解决约瑟夫问题package com.gykalc.linked;import com.gykalc.queue.MyCircleQueue;/** * 使用单向环形链表实现约瑟夫问题 * n个小朋友围成一个圈,从第1个小朋友开始数数 * 数到1 <= k <= n的数的人出队列,然后从下一个人开始再数 * 最后展示出队列的人的顺序 */public class MyCircleLinkedListDemo { public static void ma原创 2021-03-30 16:13:46 · 36 阅读 · 0 评论 -
数据结构与算法——双向链表代码实现
双向链表代码实现package com.gykalc.linked;import java.util.Comparator;public class MyDoubleLinkedListDemo { public static void main(String[] args) { MyDoubleLinkedList<Integer> myDoubleLinkedList = new MyDoubleLinkedList<>(); m原创 2021-03-30 15:09:09 · 49 阅读 · 0 评论 -
数据结构与算法——单向链表实现尾节点添加和有序添加
单向链表实现尾节点添加和有序添加话不多说,直接上代码package com.gykalc.linked;import java.util.Comparator;public class MyLinkedListDemo { public static void main(String[] args) { Hero hero1 = new Hero(1, "宋江", "及时雨"); Hero hero2 = new Hero(2, "吴用", "智多星"原创 2021-03-30 10:23:05 · 30 阅读 · 0 评论 -
数据结构与算法——代码实现队列以及环形队列
文章目录代码实现队列以及环形队列一、队列代码实现二、环形队列代码实现代码实现队列以及环形队列一、队列代码实现package com.gykalc.queue;import java.util.Scanner;public class MyQueue<E> { public static void main(String[] args) { boolean flag = true; MyQueue<Integer> myQueue原创 2021-03-30 08:35:00 · 39 阅读 · 0 评论 -
数据结构与算法——稀疏数组
文章目录稀疏数组一、稀疏数组定义二、实际应用三、代码实现稀疏数组一、稀疏数组定义 在二维数组的学习中,了解到有时候二维数组存有大量无效的数据,为零或者为空,占据了大量的空间,为了能更方便更少空间的描述此数组,即提出了稀疏数组的概念,也可以称为数组的压缩。二、实际应用 在五子棋应用中,我们的棋盘可以用一个二维数组来表示,如下: 其中占据原创 2021-03-29 14:28:54 · 28 阅读 · 0 评论