数据结构与算法
Knowing,Practicing and Understanding
andylau223
这个作者很懒,什么都没留下…
展开
-
Floyd判圈算法
Floyd判圈算法又称龟兔赛跑算法(Tortoise and Hare Algorithm),是一个可以在有限状态机、迭代函数或者链表上判断是否存在环,求出该环的起点与长度的算法。 如果有限状态机、迭代函数或者链表上存在环,那么在某个环上以不同速度前进的2个指针必定会在某个时刻相遇。同时显然地,如果从同一个起点(即使这个起点不在某个环上)同时开始以不同速度前进的2个指针最终相遇,那么可以判定存在一个环,且可以求出2者相遇处所在的环的起点与长度。 以 leetcode 141. 环形链表 为例:https:/原创 2021-04-01 17:10:15 · 100 阅读 · 0 评论 -
动态规划专题
什么是动态规划? 动态规划(Dynamic programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划不是某一种具体的算法,而是一种算法思想:若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解得出原问题的解。 应用这种算法思想解决问题的可行性,对子问题与原问题的关系,以及子问题之间的关系这两方面有一些要求,它们分别对应了最优子结构和重复子问题 最优子结构 最优子结构规定的是子问题原创 2021-03-24 17:37:00 · 88 阅读 · 0 评论 -
基本遍历框架
数组 void traverse(int[] arr) { for (int i = 0; i < arr.length; i++) { // 迭代访问 arr[i] } } 单链表 /* 基本的单链表节点 */ class ListNode { int val; ListNode next; } void traverse(ListNode head) { for (ListNode p = head; p != null; p = p.n原创 2021-02-24 11:25:05 · 126 阅读 · 0 评论 -
self-balancing binary search tree Of AVL
平衡二叉搜索树 Slef-balancing binary search tree 平衡二叉树,首先要是一个二叉排序树(Binary Sort Tree),是对BST的优化。 基本介绍 平衡二叉树也叫平衡二叉搜索树(Slef-balancing binary search tree),又被称为AVL树,可以保证查询效率较高 特点 它是一颗空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一颗平衡二叉树。 常用实现方式 红黑树、AVL、替罪羊树、Treap、伸展树等 左旋转 1.创建一个新的原创 2021-02-03 16:27:29 · 105 阅读 · 0 评论 -
BinarySortTree
二插排序树(Binary Sort Tree) 对于BST的任何一个非叶子结点,要求left的值比当前节点的值小,right的值比当前节点的值大 left[value] < current[value] && right[value] > current[value] BST的删除 1.删除叶子结点 1.找到要删除的节点 targetNode 2.找到targetNode的父节点 parent 3.确定targetNode 是 parent的左子节点 还是右子节点 4.根据前面的原创 2021-02-03 12:43:59 · 102 阅读 · 0 评论 -
HuffmanTree
赫夫曼树 基本介绍 1.给定n个权值,作为n个叶子节点,构造一颗二叉树,若该树的带权路径长度(wql)达到最小, 称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree) 2.Huffman Tree是带权路径长度最短的树,权值较大的结点离根比较近 基本概念 1.路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。 通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为 L-1 2.结点的权和带权路径长度:若将树中结点赋给一原创 2021-02-02 16:38:11 · 117 阅读 · 0 评论 -
树
二叉树 1.每个节点最多只能有两个子节点(可以只有一个节点) 2.左节点和右节点 3.如果该二叉树的所有子节点都在最后一层,并且结点总数=2^n-1,n为层数,则我们称为满二叉树。 4.如果该二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续,我们称为完全二叉树 二叉树demo public class BinaryTreeDemo { public static void main(String[] args) { } }原创 2021-01-21 22:51:11 · 105 阅读 · 0 评论 -
Hashtable Simple Implementation
eneity --> LinkedList–>Hashtable //创建HashTable 管理多条链表 class HashTable { private EmpLinkedList[] empLinkedListArray; private int size; //constructor public HashTable(int size) { this.size = size; //初始化hashtable原创 2021-01-19 11:18:00 · 87 阅读 · 0 评论 -
InsertionSearch
对 Binary Search 的一种优化 public class InsertionSearch { public static void main(String[] args) { int [] arr = new int[100]; for(int i =0;i<100;i++){ arr[i]=i+1; } int index = insertionSearch(arr, 0, arr.leng原创 2021-01-15 22:12:16 · 122 阅读 · 0 评论 -
Introduction for sort algorithm
排序的分类 1.内部排序 指将需要处理的所有数据都加载到内部存储器中进行排序 一共八种 1.插入排序(直接插入排序,希尔排序) 2.选择排序(简单选择排序,推排序) 3.交换排序(冒泡排序,快速排序) 4.归并排序 5.基数排序 2.外部排序 数据量过大,无法全部加载到内存中,需要借助外部存储进行排序 算法的时间复杂度 1.事后统计 执行程序,得到执行时间,对其进行分析。 2.事前估算 分析某个算法的时间复杂度 时间频度 一个算法执行的时间与算法中语句的执行次数成正比。 ...原创 2020-12-28 22:48:22 · 85 阅读 · 0 评论 -
Recursion-backtracking
simple version have no backtracking public class MiGong { public static void main(String[] args) { //创建一个二维数组,模拟迷宫 //map int[][] map = new int[8][7]; //使用1 表示墙 //上下全部置为1 //将左右设为1 for(int i =0.原创 2020-12-27 22:29:03 · 114 阅读 · 0 评论 -
Stack:后缀表达式计算
import java.util.ArrayList; import java.util.List; import java.util.Stack; public class PolandNotation { public static void main(String[] args) { //先定义逆波兰表达式 //(3+4)*5 -6 => 3 4 + 5 * 6 - // 4 *5 - 8 + 60 + 8 /2 -->.原创 2020-12-07 19:35:28 · 165 阅读 · 0 评论