数据结构与算法实战
文章平均质量分 80
ycjisme
2018级西南大学正经大学生
展开
-
数据结构与算法实战(十二)线段树,Trie和并查集
线段树,Trie和并查集线段树(区间树)Segment Tree为什么要使用线段树问题引出:区间染色问题颜色可被覆盖操作划分:染色操作(更新区间)查询操作(查询区间)使用数组实现,染色和查询都是遍历数组的操作,时间复杂度都是O(n),而线段树可以更高效。另一经典问题:区间查询对于给定区间:更新:更新区间中一个元素或者一个区间的值查询:查询一个区间[i,j]的最大值,最小值,或者区间数字和什么是线段树以求和为例,每一个节点存储的是线段和。线段树不是完全二叉树,但线原创 2021-01-24 16:15:59 · 355 阅读 · 0 评论 -
数据结构与算法实战(十一)希尔排序法
数据结构与算法实战(十一)希尔排序法基本思想:让数组越来越有序不能只处理相邻的逆序对实现public class ShellSort { private ShellSort(){} public static <E extends Comparable<E>> void sort(E[] data){ int h = data.length / 2; while (h >= 1){ //s原创 2020-11-28 10:13:57 · 168 阅读 · 0 评论 -
数据结构与算法实战(十)冒泡排序
数据结构与算法实战(十)冒泡排序原理比较两个相邻的元素,将值大的元素交换到右边思路依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。(1)第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。(2)比较第2和第3个数,将小数 放在前面,大数放在后面。…(3)如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成(4)在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的。(原创 2020-11-23 09:32:35 · 177 阅读 · 0 评论 -
数据结构与算法实战(九)堆与优先队列
数据结构与算法实战(九)堆与优先队列一、堆堆的基本结构使用二叉树来表示一个堆,也叫做二叉堆二叉堆是一棵完全二叉树(若设二叉树的深度为k,除第 k 层外,其它各层 (1~k-1) 的结点数都达到最大个数,第k 层所有的结点都连续集中在最左边,这就是完全二叉树。)堆中某个节点的值总是不大于其父节点的值,这样的堆叫做最大堆(根节点最大),相应的可以定义最小堆用数组存储二叉堆索引从1开始如果索引从0开始:代码实现基础架构//数组实现二叉堆public class Ma原创 2020-11-18 10:21:55 · 130 阅读 · 0 评论 -
数据结构与算法实战(八)二分搜索树
数据结构与算法实战(八)二分搜索树一、树结构树结构本身是一种天然的组织结构(例如电脑中的文件夹结构)高效(将数据使用树结构存储后,出奇的高效)二分搜索树平衡二叉树:AVL;红黑树堆 ; 并查集线段树;Trie(字典树,前缀树)二、二分搜索树(一)二叉树和链表一样,是动态数据结构class Node{ E e; Node left; //左孩子 Node right; //右孩子}二叉树具有唯一根节点二叉树每个节点最多有两个孩子二叉树每个节点最原创 2020-11-16 12:21:58 · 143 阅读 · 0 评论 -
数据结构与算法实战(七)二分查找法
数据结构与算法实战(七)二分查找法一、二分查找法介绍对于有序数列,才能使用二分查找法二分查找法是O(logn)级别的算法而排序叫做二分查找法的前置条件,如果计算排序时间:O(n logn)应用在多次查找中使用二、递归实现二分查找法public class BinarySearch { private BinarySearch(){} /** * * @param data 数组 * @param target 目标元素 * @par原创 2020-11-11 12:05:29 · 552 阅读 · 0 评论 -
数据结构与算法实战(六)快速排序法
数据结构与算法实战(六)快速排序法一、原理QuickStart(arr, l, r){ if(l >= r) return; int p = partition(arr, l, r); //对arr[l, p - 1]进行排序 QuickStart(arr, l, p-1); //对arr[p + 1, r]进行排序 QuickStart(arr, p + 1, r); }二、基础的Partition实现pr原创 2020-11-10 15:46:09 · 816 阅读 · 0 评论 -
数据结构与算法实战(五)归并排序法
数据结构与算法实战(五)归并排序法一、原理MergeSort(arr, l, r){ if(l >= r) return; //求解最基本问题 int mid = (l + r) / 2; //将原问题转化为更小的问题 //对arr[l , mid]进行排序 MergeSort(arr , l, mid); //对arr[mid + 1 , r]进行排序 MergeSort(arr , mid + 1, r); //将a原创 2020-11-07 19:07:51 · 154 阅读 · 0 评论 -
数据结构与算法实战(四)动态数据结构基础:链表
数据结构与算法实战(四)动态数据结构基础:链表链表是真正的动态数据结构一、什么是链表链表结构数据存储在节点(Node)中class Node{ E e; Node next;//指向下一个结点(最后一个结点为null)}优点:真正的动态,不需要处理固定容量问题缺点:丧失了随机访问的能力数组和链表的对比数组最好用于索引有语意的情况下。最大的优点:支持快速查询链表不适合用于索引有语意的情况。最大的优点:动态二、实现链表1、实现内部Node采用内部原创 2020-11-04 20:56:33 · 220 阅读 · 0 评论 -
数据结构与算法实战(三)基础数据结构
数据结构与算法实战(三)基础数据结构一、数组数组最大优点:快速查询1、二次封装属于我们的数组类public class Array { private int[] data; private int size; //构造函数,传入数组的容量capacity构造Array public Array(int capacity){ data = new int[capacity]; size = 0; }原创 2020-11-03 18:49:27 · 118 阅读 · 0 评论 -
数据结构与算法实战(二)基础排序算法
数据结构与算法实战(二)基础排序算法包含选择排序和插入排序一、选择排序法1、算法引入先把最小的拿出来,在剩下的里面再把最小的拿出来…这个过程一直持续,每次选择还没处理的元素里最小的元素2、原地排序排序过程占用了额外的空间,而是否可以原地完成是排序算法中一个关键点。选择排序法可以原地排序3、算法思想循环不变量:arr[i…n) 未排序 arr[0…i) 已排序arr[i…n) 中的最小值要放到arr[i]的位置4、代码实现//使用泛型public class Selectio原创 2020-10-29 18:35:49 · 135 阅读 · 0 评论 -
数据结构与算法实战(一)线性查找
数据结构与算法实战(一)线性查找一、算法引入在一堆试卷中,找到属于自己的试卷,需要一张一张的查看,第一张:不是,第二张:不是,… 第十张:是,找到了算法输入:数组(或其他数据结构)和目标元素算法输出:目标元素所在索引;若不存在,则返回-1二、代码实现public class LinearSearch { private LinearSearch(){} //构造函数私有化,无法new一个对象 public static int search(int[] data, i原创 2020-10-28 21:26:00 · 290 阅读 · 0 评论