数据结构
文章平均质量分 72
哲里哲里
更好的自己
展开
-
灵魂一问:数组的查找为什么比链表快?
一般面试大概率会问到数组与链表的比较,那大家一定都知道数组的查找效率优于链表,那么为什么会这样呢,我们今天来仔细分析下原因。一、什么是数组?我想大家应该都知道答案:数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。有两个关键词:线性表 顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。内存连续,数据类型相同因为这两个特性,数组才有了一个强大...原创 2020-07-01 08:54:45 · 1593 阅读 · 1 评论 -
O(n) 时间复杂度内求无序数组中的第 K 大元素
思路:我们选择数组区间 A[0…n-1]的最后一个元素 A[n-1]作为 pivot,对数组 A[0…n-1]原地分区,这样数组就分成了三部分,A[0…p-1]、A[p]、A[p+1…n-1]。如果 p+1=K,那 A[p]就是要求解的元素;如果 K>p+1, 说明第 K 大元素出现在 A[p+1…n-1]区间,我们再按照上面的思路递归地在 A[p+1…n-1]这个区间内查找。同理,如果 K<p+1,那我们就在 A[0…p-1]区间查找。代码如下:package com..原创 2020-06-09 23:45:22 · 1441 阅读 · 4 评论 -
《数据结构与算法之美》-------- 栈 (实现算术表达式的求值 java语言实现)
利用栈实现算术表达式的求值package com.my.datastructure;import java.util.Stack;/** * @author zhe.sun * @Description: 利用栈实现算术表达式的求值 * @date 2020/5/8 23:25 */public class StackTest { public static void main(String[] args) { System.out.println(c.原创 2020-05-09 01:01:36 · 427 阅读 · 0 评论 -
《数据结构与算法之美》----常见的链表操作
目录单链表反转两个有序的链表合并删除链表倒数第 n 个结点循环链表----约瑟夫问题单链表反转 /** * 翻转链表 * * 1->2->3 * * @param head * @return */ public static Node reverseList(Node h...原创 2020-05-06 22:13:02 · 231 阅读 · 0 评论 -
concurrenthashmap 源码分析(一) - putVal() 方法
这篇文章主要分析putVal方法的源码,这里面也包括了 concurrenthashmap大部分的常用的方法,例如 initTable、spread、transfer、treeifyBin、addCount等等一、概述A hash table supporting full concurrency of retrievals and high expected concurr...原创 2020-04-10 09:17:05 · 759 阅读 · 0 评论 -
concurrenthashmap 源码分析(四 ) - addCount() 方法
在putVal 方法的最后会调用 addCount方法从 putVal 传入的参数是( 1, binCount),binCount 默认是0,只有 hash 冲突了才会大于 1.且他的大小是链表的长度,红黑树是2来看下源码:/** * Adds to count, and if table is too small and not already * resiz...原创 2020-04-24 01:16:54 · 879 阅读 · 0 评论 -
concurrenthashmap 源码分析(三) - transfer() 方法
一、当 node 的 hash 等于 MOVED的时候会进行helpTransfer方法也就是当发现其他线程正在扩容的时候,当前线程去帮助扩容/** * Helps transfer if a resize is in progress. */ final Node<K,V>[] helpTransfer(Node<K,V>[] ta...原创 2020-04-24 00:06:11 · 723 阅读 · 0 评论 -
concurrenthashmap 源码分析(二) - initTable() 方法
前一章我们在putVal 方法中看到,当 node 的 hash 等于 MOVED的时候会进行helpTransfer方法也就是当发现其他线程正在扩容的时候,当前线程去帮助扩容 /** * Helps transfer if a resize is in progress. */ final Node<K,V>[] helpTransfer(No...原创 2020-04-23 00:05:57 · 931 阅读 · 0 评论 -
lintcode-两数之和-BST版本
题目:给一棵二叉搜索树以及一个整数 n, 在树中找到和为 n 的两个数字样例:给一棵BST: 4 / \ 2 5 / \1 3以及一个整数 n = 3返回 [1, 2] 或 [2, 1]思路:遍历节点,在节点上判断另一个数是否存在代码:/** * Definition of TreeNode:原创 2018-02-05 22:29:37 · 626 阅读 · 0 评论 -
算法-二叉查找树-插入节点
题目:给定一棵二叉查找树和一个新的树节点,将节点插入到树中。你需要保证该树仍然是一棵二叉查找树。样例给出如下一棵二叉查找树,在插入节点6之后这棵二叉查找树可以是这样的: 2 2 / \ / \1 4 --> 1 4 / / \ 3 3 6原创 2018-01-29 09:10:46 · 640 阅读 · 0 评论 -
算法-二叉查找树-迭代器
题目:设计实现一个带有下列属性的二叉查找树的迭代器:元素按照递增的顺序被访问(比如中序遍历)next()和hasNext()的询问操作要求均摊时间复杂度是O(1)样例对于下列二叉查找树,使用迭代器进行中序遍历的结果为 [1, 6, 10, 11, 12] 10 / \1 11 \ \ 6原创 2018-02-01 23:14:20 · 344 阅读 · 0 评论 -
算法-二叉查找树-搜索区间
题目:给定两个值 k1 和 k2(k1 样例如果有 k1 = 10 和 k2 = 22, 你的程序应该返回 [12, 20, 22]. 20 / \ 8 22 / \4 12代码如下:类似中序遍历,加上区间的筛选。/** * Definition of TreeNode: * public class T原创 2018-01-31 23:03:44 · 565 阅读 · 0 评论 -
算法-二叉查找树-删除节点
题目:给定一棵具有不同节点值的二叉查找树,删除树中与给定值相同的节点。如果树中没有相同值的节点,就不做任何处理。你应该保证处理之后的树仍是二叉查找树。样例:给出如下二叉查找树: 5 / \ 3 6 / \2 4删除节点3之后,你可以返回: 5原创 2018-01-30 23:22:21 · 1139 阅读 · 0 评论