
数据结构与算法
hello_读书就是赚钱
2020年12月加入某头部互联网公司,担任高级开发工程师,从事公司核心软件开发/
2017年6月加入某1000人+软件公司,担任中级架构师从事公司核心软件项目开发,分布式架构研究、部署,生产环境维护等工作
展开
-
review了一次ConcurrentHashMap
是什么一、介绍支持读取高并发的Map所有操作支持高并发任何操作不会锁整表,保护全表获取操作,使之能高并发效果跟Hashtable一样,但不是使用synchronize读操作会在修改操作后,遵循heppen-before原则,谁以先操作的动作为准并发读只能影响全量操作中正在操作的节点迭代器读取的是创建迭代器之前的那个状态(创建迭代器的时候,始终遍历的是创建迭代器时的hash表)所以不会抛出并发修改异常(读的都是修改后的结果)获取长度,是否为空,是否包含值原创 2020-09-07 02:20:11 · 159 阅读 · 0 评论 -
LinkedList源码探险记
1.进入到linkedList里面,首先发现一个size属性,记录当前链表的长度 2.存在一个结点内部类Node,该类没有什么特别之处,就简单的记录该结点的前驱与后继,与结点存的当前元素 private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(No原创 2017-01-25 19:32:28 · 266 阅读 · 0 评论 -
ArrayList源码探险记
Arraylist: 基本知识点: 1.arrayList 内部构造是一个数组,所以构造时存在着一定的容量(负载因子),所以当数组列表满了的时候会出现自动扩容的状态。2.第二个知识点很简单,该类不是一个线程安全类,所以当你在使用迭代器进行的迭代的时候你不能修改其中的数据,不然会有一个ConcurrentModificationException。这样的运行失败问题也称为快速失败。源码分析:1、跟原创 2016-12-27 22:44:50 · 345 阅读 · 0 评论 -
一头扎进算法导论-二叉树性质总结
设二叉树的深度为h,二叉树的结点数为n 那么1.高度为h的二叉树最多有 2^h - 1 结点最少有 2^(h - 1)个结点第k层上最多有2^(h-1)个结点2.结点数为n的二叉树高度h = log2(n)+13.如果有一颗有n个节点的完全二叉树的节点按层次序编号,对任一层的节点i(1<=i<=n)有 1.如果i=1,则节点是二叉树的根,无双亲,如果i>1,则其双亲节点为[i/2],向原创 2016-10-19 15:29:36 · 344 阅读 · 0 评论 -
一头扎进算法导论-shell排序
定义:希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。过程:原文出自白话shell 以n=10的一个数组49, 38, 65, 97, 26, 13, 27, 49, 5原创 2016-10-26 19:39:55 · 453 阅读 · 0 评论 -
一头扎进算法导论-二分法查找
定义:分治算法的另一种体现。每一次查找与中间值比较,可以确定是否查找成功,不成功当前查找区间缩小一半,递归找,即可。步骤: (1)确定该区间的中间位置 mid (2)将查找的值 value 与 a[mid] 比较。 若相等,查找成功返回此位置; 否则确定新的查找区域,继续二分查找。 区域确定如下: value < a[mid] : 新区域为a[start] 至 s[mid-1] va原创 2016-10-16 01:36:09 · 550 阅读 · 0 评论 -
一头扎进算法导论-二分法思想改进插入排序O(nlog2(n))
背景:我们知道在插入算法中,是根据while循环采用一种线性查找(反向)来扫描已排好序的子数组A[1…j-1]。现在我们使用二分查找来把插入排序的最坏总运行情况O(n^2) 改进为O(nlog2(n))public int[] sortByBinary(int[] a){ System.out.println(Arrays.toString(a)); for(int原创 2016-10-16 04:06:13 · 702 阅读 · 0 评论 -
一头扎进算法导论-插入排序
定义:直接插入排序是一种简单的排序方法,她的基本思想是依次将每个记录插入到一个已排好序的有序表中去,从而得到一个新的、记录数增加1的有序表,就好比斗地主抓牌排序的这么一个过程过程: 用自己的话说: 用一个索引key表示当前捉到的牌,如图中红框所示。 用一个索引i表示已经排序好的牌(从key牌左边开始轮询),如图中黑框所示意。 从索引2开始捉牌,每次捉牌时进行三个步骤1.记录key的牌的值原创 2016-10-11 18:22:07 · 444 阅读 · 0 评论 -
一头扎进算法导论-归并排序
定义:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。用自己的话说:使用递归,把一数组分为两个子数组,再分为四个子数组…,直到子数组的个数为2时开始层层向上归并,最后得到排序好的数组过程: 代码: publ原创 2016-10-15 23:06:02 · 323 阅读 · 0 评论 -
一头扎进算法导论-冒泡排序
定义:交换排序的基本思想是,通过比较两个记录键值的大小,如果这两个记录键值的大小出现逆序,则交换这两个记录,这样将键值较小的记录向序列前部移动,键值较大的记录向序列后部移动。假设数组总长度是n,那么总共需要重头开始执行n-1次过程: 用自己的话说: 1.先判断一共执行多少次,假设数组总长度是n,则一共执行n-1次,当前次数为第i次。 2.则执行n-1次循环,在每次循环中对0到 n-1-i 前一原创 2016-10-15 18:59:38 · 439 阅读 · 0 评论 -
一头扎进算法排序-直接选择排序
定义:它的基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,….,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,…..,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列·过程: 点击这里查看,一点就通用自己的话说:从原创 2016-10-25 16:27:03 · 390 阅读 · 0 评论 -
一头扎进算法导论-快速排序(挖坑填数策略)
定义:它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。过程: 用自己的话: 以前大学的时候听说牛逼的程序员是能裸写快排,导致自己学习快速排序的时候带有一点点压力,也有点难以理解,不过当我看到这篇 快速排序白话文的时候,在纸上面演示了原创 2016-10-25 14:18:34 · 1726 阅读 · 0 评论 -
一头扎进算法导论-堆排序
定义:堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。过程: 用自己的话说: 分成两个原创 2016-10-23 01:27:26 · 410 阅读 · 0 评论