玩转数据结构学习笔记
玩转数据结构学习笔记
一角残叶
人生如逆旅,我亦是行人
展开
-
二分搜索树篇(1)—— 二分搜索树添加元素、递归遍历
1原创 2019-02-01 11:07:52 · 841 阅读 · 0 评论 -
链表篇(5)—— leetcode 链表第203题 递归解法
1 递归求解 leetcode第2031.1 递归测试递归的要素package linked_list_leetcode;/* * * 用递归的方式算 arr 数组的和 * */public class Sum { public static int sum(int[] arr) { return sum(arr, 0); } //...原创 2019-01-30 22:54:04 · 314 阅读 · 0 评论 -
平衡树和 AVL (2) —— 旋转操作(LL,RR)
1 右旋转左子树的高度比右子树的高度高,并且高度差比 1 大。同时它的左孩子也是,左子树高度大于等于右子树;x.right = yy.left = T32 左旋转插入的元素在不平衡的节点的右侧的右侧;y 的右子树的高度值比左子树高度值大于 1T4 < y < T3 < x < T1 < z < T2x.left = yy.r...原创 2019-02-11 10:00:26 · 383 阅读 · 0 评论 -
平衡树和 AVL (3) —— 旋转操作(LR,RL)
1 LR先对 x 进行左旋转,整棵树就转化为 LL 的情况2 RL先对 x 进行右旋转,转化成了 RR 的情况3 AVLTree.javapackage avltree;import java.util.ArrayList;public class AVLTree<K extends Comparable<K>, V> { pub...原创 2019-02-11 10:18:10 · 546 阅读 · 0 评论 -
平衡树和 AVL (3) —— AVL 树删除节点
1 平衡树删除节点AVLTree.javapackage avltree;import java.util.ArrayList;public class AVLTree<K extends Comparable<K>, V> { public class Node { public K key; public V ...原创 2019-02-11 10:49:28 · 672 阅读 · 0 评论 -
平衡树和 AVL (4) ——基于AVL树的集合和映射
1 基于AVL树的集合和映射Map.javapackage tree;public interface Map<K, V> { void add(K key, V value); V remove(K key); boolean contains(K key); V get(K key); void set(K key, V...原创 2019-02-11 14:39:22 · 205 阅读 · 0 评论 -
红黑树(1)—— 红黑树和 2-3 树
1 红黑树介绍1.1 红黑树性质每个节点是黑色或者红色;根节点是黑色;每一个叶子节点(最后的空节点)是黑色;如果一个节点是红色的,那么他的孩子节点都是黑色的;从任意一个节点到叶子节点,经过的黑色节点是一样的;2 2-3树满足二分搜索树的基本性质节点可以存放一个元素或者两个元素每个节点有 2 或者 3 个孩子2-3树 是绝对平衡的树(从根节点到任意一个叶子节点所经过的节点...原创 2019-02-12 16:50:02 · 276 阅读 · 0 评论 -
红黑树(2)—— 红黑树颜色翻转和右旋转
3 颜色翻转和右旋3.1 颜色翻转(flipcolors)RBTree.javapackage tree;public class RBTree&lt;K extends Comparable&lt;K&gt;, V&gt; { private static final boolean RED = true; private static final bool...原创 2019-02-12 19:32:03 · 878 阅读 · 0 评论 -
红黑树(3)——红黑树添加新元素 和 总结
1 2-3树添加新元素第一种:添加进 2 节点,形成一个3节点;第二种: 添加进 3 节点,暂时形成一个 4 节点;2 红黑树添加节点永远添加红色节点2.1 保持根节点是黑色,左旋转node.right = x.leftx.left = nodex.color = nodenode.color = RED// node x ...原创 2019-02-12 21:09:17 · 521 阅读 · 0 评论 -
哈希表(1)——哈希冲突处理 和实现自定义的哈希表
1 哈希函数设计最简单的方法:模一个素数2 哈希冲突的处理—— 链地址法(Seperate Chaining)Java8 之前,每一个位置对用一个链表;Java8 开始,当哈希冲突达到一定程度,每一个位置从链表转成红黑树;3 实现自定义的哈希表HashTablepackage hashtable;import java.util.TreeMap;public ...原创 2019-02-13 16:35:38 · 410 阅读 · 0 评论 -
哈希表(2)——哈希表动态空间处理和复杂度分析
1 哈希表复杂度分析(链地址法)一共有 M 个地址,如果放入的总元素个数是 N如果每个地址是链表,O(N / M)如果每个地址是平衡树:O(log( N / M))2 哈希表的动态空间处理当平均每个地址承载的元素超过一定程度,即扩容,N / M >= upperTol当平均每个地址承载的元素少过一定程度,即缩容, N / M < lowerTolHashTable...原创 2019-02-13 17:41:45 · 3879 阅读 · 0 评论 -
哈希表(3)——哈希冲突处理
1 链地址法地址具有封闭性2 开放地址法2.1 开放地址法之线性探测法遇到哈希冲突: + 1hash(x) = x % 10 2号位置为空,31 向后挪一位2.2 开放地址法之平方探测法遇到哈希冲突:+1,+4,+9,+162.3 开放地址法之二次哈希遇到哈希冲突:使用另一个哈希函数3 再哈希法(Rehashing)4 Coalesced Hash...原创 2019-02-14 10:02:41 · 439 阅读 · 0 评论 -
归并排序 + 快排 +二分法
1 归并排序(Merge sort)https://time.geekbang.org/column/article/0?cid=126原创 2019-03-13 20:01:45 · 459 阅读 · 0 评论 -
基本的排序算法:冒泡排序 + 插入排序 + 选择排序
1原创 2019-03-13 12:06:24 · 134 阅读 · 0 评论 -
常用算法时间复杂度表
1 常用算法时间复杂度来源: http://www.bigocheatsheet.com/1.1 常用数据结构算法复杂度1.2 常用排序算法复杂度原创 2019-02-14 16:58:31 · 1405 阅读 · 0 评论 -
链表篇(4)—— leetcode 链表第203题 和 如何测试
1 Remove Linked List Elements2 测试自己的代码package linked_list_leetcode;class ListNode { int val; ListNode next; ListNode(int x) { val = x; } public ListNode(int[] arr) ...原创 2019-01-30 22:31:52 · 299 阅读 · 0 评论 -
链表篇(3)—— 使用链表实现队列
1 改进链表head 添加和删除元素很容易;tail 只是添加元素容易;head 作为 队首没有 虚拟头结点,注意链表为空的情况;2 基于链表的队列Queue.javapackage linkedlist;public interface Queue<E> { int getSize(); boolean isEmpty(); vo...原创 2019-01-30 19:43:45 · 297 阅读 · 0 评论 -
二分搜索树篇(2)—— 二分搜索树前序非递归遍历+ 按层遍历
1原创 2019-02-02 10:48:22 · 425 阅读 · 3 评论 -
二分搜索树篇(3)—— 删除二分搜索树的最大元素和最小元素,任意值
1 删除二分搜索树的最大元素和最小元素1.1 寻找最小节点 public E minimum() { if (size == 0) { throw new IllegalArgumentException("BST is empty"); } return minimum(root).e; } //...原创 2019-02-04 12:10:10 · 477 阅读 · 0 评论 -
集合和映射(1)—— 基于二分搜索树和基于链表实现集合
1 基于二分搜索树的集合实现BST.javapackage tree;import java.util.LinkedList;import java.util.Queue;import java.util.Stack;/* * * 实现的二分搜索树不包含重复元素 * * 如果想包含重复元素,只需要定义: * 左子树小于等于节点,或者右子树大于等于节点 * */p...原创 2019-02-04 21:46:58 · 683 阅读 · 0 评论 -
集合和映射(2)——集合的时间复杂度分析
1 集合的时间复杂度分析LinkedListSetBSTSetaddO(n)O(h)containsO(n)O(h)removeO(n)O(h)原创 2019-02-05 11:02:48 · 424 阅读 · 0 评论 -
集合和映射(3)—— 基于链表和二分搜索树的映射的实现
1 基于链表的映射实现Map.javapackage setAndmap;public interface Map&lt;K, V&gt; { void add(K key, V value); V remove(K key); boolean contains(K key); V get(K key); void set(K key,...原创 2019-02-06 15:14:13 · 254 阅读 · 0 评论 -
优先队列和堆篇(1)—— 二叉堆介绍
1 优先队列堆在最差的情况下也是 O(logn)入队出队普通线性结构O(1)O(n)顺序线性结构O(n)O(1)堆O(logn)O(logn)2 堆的基础表示—— 二叉堆二叉堆是一棵完全二叉树完全二叉树:把元素顺序排列成树的形状。(把元素一层一层排列直到放不下为止)二叉堆: 堆中某个节点的值总是不大于其父节点的值。(根节点最大,这...原创 2019-02-07 10:37:42 · 482 阅读 · 0 评论 -
优先队列和堆篇(2)—— 二叉堆
1原创 2019-02-07 17:08:22 · 132 阅读 · 0 评论 -
优先队列和堆篇(3)——借助堆实现优先队列
1 借助堆实现优先队列Queue.javapackage heap;public interface Queue<E> { int getSize(); boolean isEmpty(); void enqueue(E e); E dequeue(); E getFront();}MaxHeap.javapacka...原创 2019-02-07 19:16:48 · 183 阅读 · 0 评论 -
线段树篇(1)—— 创建线段树
1 线段树(区间树)(Segment Tree)线段树不是完全二叉树线段树是平衡二叉树;平衡二叉树:最大深度和最小深度只差最多为1;1.1 为何使用线段树对于有些问题,关注的是线段(区间)1.2 操作更新: 更新区间中一个元素或者一个区间的值;查询一个区间【i,j】的最大值,最小值或者区间数字和;1.3 如果区间有 n 个元素,数组表示需要有多少节点?0层 - 1 ...原创 2019-02-08 18:43:27 · 745 阅读 · 0 评论 -
线段树篇(2)—— 线段树的区间查询
1 线段树的区间查询SegmentTree.java// 在以 treeIndex 为根的线段树中[l,r] 的范围里,搜索区间 [queryL,queryR] 的值 private E query(int treeIndex, int l, int r, int queryL, int queryR) { if (l == queryL && r...原创 2019-02-08 22:12:38 · 265 阅读 · 0 评论 -
Trie字典树(1)—— 字典树查询
1 Trie 介绍1.1 字典如果有 n 个条目,使用树结构,查询的时间复杂度是 O(logn);如果有100 万个条目(2^20),logn 大约数201.2 Trie查询每个条目的时间复杂度和字典中的条目总数无关;时间复杂度是 O(w),w 是查询单词的长度;1.3 Trie 的查询Trie.javapackage tree;import java.util....原创 2019-02-09 15:44:04 · 418 阅读 · 0 评论 -
平衡树和 AVL (1) —— 二分搜索树的性质和平衡性的检查
1 平衡二叉树对于任意一个节点,左子树和右子树的高度差不能超过1;平衡二叉树的高度和节点数量的关系是 O(logn)标注节点高度(棕色)计算平衡因子 = 左子树和右子树高度之差(绿色)2 检查二分搜索树的性质和平衡性AVLTree.javapackage avltree;import java.util.ArrayList;public class AVLTr...原创 2019-02-10 09:43:41 · 310 阅读 · 0 评论 -
链表篇(1)—— 构建链表 和 为链表设立虚拟头结点
1 构建链表LinkedList.javapackage linkedlist;public class LinkedList<E> { private class Node { public E e; public Node next; public Node(E e, Node next) { ...原创 2019-01-30 19:00:27 · 467 阅读 · 0 评论 -
链表篇(2)—— 使用链表实现栈
1 使用链表实现栈Stack.javapackage linkedlist;public interface Stack<E> { int getSize(); boolean isEmpty(); void push(E e); E pop(); E peak();}LinkedListStack.javapackag...原创 2019-01-30 19:15:59 · 261 阅读 · 0 评论 -
二分法查找法学习笔记总结
1 二分法学习笔记总结参考https://leetcode-cn.com/problems/search-insert-position/solution/te-bie-hao-yong-de-er-fen-cha-fa-fa-mo-ban-python-/https://leetcode-cn.com/problems/find-first-and-last-position-of-el...原创 2019-09-01 16:38:45 · 1073 阅读 · 0 评论