数据结构与算法
盎哈
学习中
展开
-
统计文本文件中每个单词的数量并倒序输出
统计文本文件中每个单词的数量并倒序输出收获:学会使用Iterator以及Comparatorpackage ccc.mm;import java.io.File;import java.util.HashMap;import java.util.Iterator;import java.util.Scanner;import java.util.Set;import java.util.ArrayList;import java.util.Comparator;import java.u原创 2021-08-08 17:44:44 · 208 阅读 · 0 评论 -
二分查找Java
二分查找总结1、if里面写想要找到的逻辑的相反,保证if 的逻辑简单;2、while (left < right) ,left == right ,把区间分成2个部分;3、当把mid置于左半边,则mid向下取整;当把mid置于右半边,则mid向上取整;4、mid的取值(1)int mid = (left + right) / 2;在 left 和 right 较大的时候,left + right 会发生整型溢出,变成负数;(2)int mid = left + (right - left)原创 2021-06-13 21:36:24 · 1069 阅读 · 1 评论 -
贪心算法Java实现
贪心算法-集合覆盖1、基本原理1)遍历所有电台,找到一个覆盖了最多未覆盖地区的电台;2)把该电台加入到一个集合中,再设法把该电台覆盖的地区在下一次比较时去掉;3)重复第一步,直到不存在未覆盖地区。public class Greedy { public static void main(String[] args) { // TODO Auto-generated method stub //构建一个哈希表,存放所有电台名字和覆盖的地区 HashMap<String, Has原创 2021-03-03 10:52:23 · 150 阅读 · 1 评论 -
KMP算法Java实现
字符串匹配给定两个字符串,字符串 str1 和 子串 str2,找出子串 str2 和 字符串 str1匹配的初始匹配位置,若没有,则返回-11、暴力匹配1)规定 i 为 str1 的索引,j 为 str2 的索引;2)i 和 j 都从0开始,若当前字符匹配成功,即 str[i] == str2[j];则匹配下一个位置,即 i++, j++;3)若匹配不成功,则令 j = 0, i = i - j + 1,即 i 回到起始位置的下一个位置public static int VoilenceMat原创 2021-03-02 20:43:43 · 146 阅读 · 0 评论 -
分治算法Java实现
分治算法1、分治算法1)分解:将原问题分解为若干个相互独立,与原问题形式相同的子问题;2)解决:若子问题规模小容易解决则直接解,否则递归求解子问题;3)合并:将各个子问题的解合并为原问题的解。2、汉诺塔1)基本内容:有A、B、C三根柱子,A柱子上从下向上依次摞着大小不同的盘子,要求大盘子必须在小盘子下面摞着;借助B柱子,把A柱子上的盘子移动到C柱子上,要求大盘子必须在小盘子下面摞着,且三根柱子间一次只能移动一个盘子。2)主要思想(1)若盘子数 n = 1,则直接从 A->C;(2)若原创 2021-02-19 20:24:09 · 229 阅读 · 0 评论 -
动态规划Java实现
1、动态规划1)核心思想:将大问题划分为小问题2)经分解得到的小问题不是相互独立的,即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解。3)可以通过填表的方式来逐步推进,得到最优解。2、背包问题1)基本内容:一个给定容量的背包,若干具有一定价值和重量的物品,选择物品放入背包使物品的总价值最大。2)01背包和完全背包(1)01背包:每种物品最多放1个(2)完全背包:每种物品有无限件可用,每种可放入任意个3)主要思想(1)设置第 i 个物品,其重量为 w[i],价值为 v原创 2021-02-19 11:23:02 · 223 阅读 · 0 评论 -
图Java实现
图1、图的原理1)图:顶点和边组成2)实现(1)邻接矩阵(2)邻接表2、深度优先搜索1)定义:首先访问初始节点的第一个邻接节点,再访问该邻接节点的第一个邻接节点,……2)实现步骤(1)访问初始节点 v,并把其标记为已访问;(2)查找 v 的第一个邻接节点 w;(3)判断 w 是否存在,若 w 存在,则执行第(4);若不存在,则从v之后的节点继续开始步骤1-3;(4)判断 w 是否已访问,若未被访问,则以 w 为初始节点进行深度优先搜索;(5)查找 v 的下一个邻接节点 新w。3、原创 2020-12-21 11:23:07 · 257 阅读 · 0 评论 -
二叉排序树和平衡二叉树(AVL树)Java实现
二叉排序树1、基本概念1)二叉排序树BST:对于任何一个非叶子节点,要求其左子节点的值比当前值小,其右子节点的值比当前值大。2)中序遍历二叉排序树会得到一个升序序列。2、二叉排序树的创建1)创建节点和二叉排序树2)递归添加节点3、二叉排序树的删除节点0)预先判断:判断二叉排序树是否存在;判断删除节点是否存在1)删除节点为叶子节点(1)首先判断该叶子节点的父节点是否为空(2)若为空,则说明删除节点为根节点,且根节点为叶子节点,即:二叉排序树只有一个根节点,将根节点置为空,即可删除。(3原创 2020-12-19 13:50:11 · 205 阅读 · 1 评论 -
哈夫曼编码Java实现
哈夫曼编码1、基本概念1)一种可变长的前缀编码,常用于数据压缩2、实现步骤1)把字符串转换为字符数组,统计出每个字符出现的次数;2)把每个字符出现的次数作为该字符的权值,每个字符对应的ascii码作为数据;3)利用每个字符的权值,构建哈夫曼树;4)根据哈夫曼树,给每个字符编码,向左的路径编码为 0,向右的路径编码为 1;// 构建哈夫曼树public static Node createHuffmanTree(List<Node> nodes){ while(nodes.si原创 2020-12-12 12:23:55 · 1692 阅读 · 2 评论 -
堆排序Java实现
堆排序8、堆排序1)堆知识(1)大顶堆:每个节点的值都比其左右子节点大的完全二叉树;(2)小顶堆:每个节点的值都比其左右子节点小的完全二叉树;2)基本原理(1)把数组构建成一个大顶堆(升序大顶堆,降序小顶堆),此时该大顶堆的根节点即为数组中最大元素,把根节点和最后一个元素交换位置;(3)再把剩下的元素组成的堆调整为大顶堆,把当前根节点和次最后一个元素交换位置;(4)重复(3)步骤,直到所有元素都排序完成。3)性质(1)时间复杂度①平均:O(nlogn)②最好:O(nlogn)③最坏原创 2020-12-11 18:19:23 · 70 阅读 · 1 评论 -
线索化二叉树Java实现
1、线索化二叉树概念1)具有 n 个节点的二叉树的空指针域为 n+1,利用空指针域存放指向该节点在某种遍历下的前驱和后继节点的指针,附加的指针称为“线索”。2)线索二叉树(1)前序线索二叉树(2)中序线索二叉树(3)后续线索二叉树3)前驱和后继节点(1)前驱节点:当前节点的前一个节点(2)后继节点:当前节点的后一个节点class ThreadedBinaryTree{ Node root; Node pre; // 前序线索化二叉树 public void preOrderThre原创 2020-12-10 10:31:11 · 157 阅读 · 0 评论 -
顺序存储二叉树Java实现
顺序存储二叉树1、顺序存储二叉树概念1)在二叉树中存放数组元素,数组元素的下标和完全二叉树的节点顺序一致;原创 2020-12-10 08:56:49 · 63 阅读 · 0 评论 -
二叉树的遍历、查找、删除Java实现
二叉树1、二叉树递归遍历1)前序遍历(1)输出当前节点;(2)若当前节点的左子节点不为空,则递归前序遍历左子树;(3)若当前节点的右子节点不为空,则递归前序遍历右子树2)中序遍历(1)若当前节点的左子节点不为空,则递归中序遍历左子树;(2)输出当前节点;(3)若当前节点的右子节点不为空,则递归中序遍历右子树;3)后序遍历(1)若当前节点的左子节点不为空,则递归中序遍历左子树;(2)若当前节点的右子节点不为空,则递归中序遍历右子树;(3)输出当前节点;2、二叉树查找1)前序查找原创 2020-12-08 17:09:51 · 104 阅读 · 0 评论 -
哈希表(散列表)Java实现
1、原理1)根据关键码值进行访问,即通过把关键码值映射到表中一个位置来访问表中该位置的信息;2)映射函数:散列函数3)存放信息的数组:散列表4)可以加快查找信息;2、实现(增删改查员工信息)1)用数组和链表实现哈希表(1)数组中的每个元素是一个链表(2)在链表中添加员工...原创 2020-11-30 09:41:10 · 99 阅读 · 0 评论 -
栈Java实现
栈1、栈的概述1)原理(1)栈是一个先入先出的有序列表(2)只允许在“栈顶(Top)”插入和删除;2)栈的实现(1)用数组实现栈class ArrayStack{ int[] stack; int top = -1; int maxSize; public ArrayStack(int maxSize){ this.maxSize = maxSize; stack = new int[maxSize]; } public boolean isEmpty(){ retur原创 2020-11-28 18:02:43 · 73 阅读 · 0 评论 -
单向环形链表(约瑟夫问题)Java实现
单向环形链表(约瑟夫问题)1、应用场景1)设编号为1、2、……、n的n个人围坐一圈,约定编号为k的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的人又出列,依次,直到所有人出列。2、实现class Node{ public int no; public Node next; public Node(int no){ this.no = no; }}// 不带头节点的单向环形链表class SingleCircleLinkedList{ Node first原创 2020-11-24 13:26:17 · 83 阅读 · 0 评论 -
双向链表Java实现
双向链表1、双向链表介绍1)单向链表查找方向只有一个,双向链表可向前或向后查找;2)单向链表不能自我删除,需要依靠辅助节点,即找到链表待删除结点的前一个节点,双线链表可自我删除;3)next:指向前一个节点;pre:指向后一个节点。2、双向链表实现class Node{ public int no; public String name; Node next; Node pre; public Node(int no, String name){ this.no = no; t原创 2020-11-23 18:14:40 · 113 阅读 · 0 评论 -
单向链表Java实现
链表1、链表介绍1)链表是有序的列表。2)链式存储,以节点的方式存储,链表的各个节点不一定是连续存储;3)每个节点包含:数据域,指针域;4)分为带头节点的链表和不带头节点的链表。2、单链表实现class Node{ public int no;// 节点的编号 public String name;// 节点的名字 Node next; // 重写toString public String toString(){ return "Node[no=" + no + "name="原创 2020-11-23 15:02:48 · 61 阅读 · 0 评论 -
队列Java实现
队列1、数组实现队列1)基本思路(1)类属性①数组的最大容量:maxSize②数组:arr[]③队头:front 指向队首的前一个元素④队尾:rear 指向队尾元素(2)类方法①判断队列是否为空②判断队列是否已满③入队④出队⑤显示队列所有元素⑥显示队首元素2)缺点:数组使用一次就不可再使用,出队列之后数组中空出来的位置无法使用,因此要改进为一个环形队列。class ArrayQueue{ private int maxSize; private int arr[]; p原创 2020-11-21 16:29:31 · 138 阅读 · 1 评论 -
稀疏数组Java实现
稀疏数组1、稀疏数组1)基本原理(1)数组中大部分元素为0或同一个值,可用稀疏数组保存该数组2)具体实现1)稀疏数组共有3列;2)系数数组的第1行的3列分别保存原始二维数组的:行数,列数,非0元素个数;3)系数数组的下面每一行的3列分别保存原始二维数组中非0元素的:行标,列标,元素值public class SparseArray{ public static void mian(String[], args){ // 生成二维数组 int arr1[][] = new int[1原创 2020-11-21 12:02:49 · 110 阅读 · 0 评论 -
查找Java实现
查找算法1、线性查找1)基本原理:(1)挨个查找,找到返回下标;找不到返回 -1。public static int seqSearch(int arr[], int value){ for(int i = 0; i < arr.length; i++){ if(arr[i] == value){ return i; } } return -1;}2、二分查找1)基本原理(1)必须是有序序列才能进行二分查找;(2)比较arr[mid]和value的大小,若arr原创 2020-11-19 18:36:42 · 157 阅读 · 0 评论 -
基本排序Java实现
基本排序算法1、冒泡排序public static void bubbleSort(int arr[]){ for(int i = 0; i < arr.length - 1; i++){ boolean flag = false; for(int j = 0; j < arr.length - 1 - i; j++){ if(arr[j] > arr[j+1]){ int tmp = arr[j]; arr[j] = arr[j + 1]; a原创 2020-11-16 09:48:26 · 68 阅读 · 0 评论