
data struct
文章平均质量分 65
bitcarmanlee
这个作者很懒,什么都没留下…
展开
-
归并排序java实现
归并排序是分治思想(divide-and-conquer)的经典运用。分治是先将现有问题分(divide)成一些小问题去递归求解,然后再将所有分的问题进行治理(conquer)合并得到最终结果。1.归并排序利用了完全二叉树的性质,最好最坏与平均时间复杂度均为O(nlogn)。下图来自参考文献1,该图就很清晰描述了归并排序的全过程。2.归并排序是一种稳定排序算法。原创 2023-05-16 17:55:30 · 925 阅读 · 0 评论 -
堆排序与取topK java实现
将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。最近趁着有点时间,稍微复习了一下数据结构相关内容,温习了一下堆排序,做一下记录。关键的步骤以及作用,都已经在代码中进行了注释,再结合参考文献1就可以容易理解。求一个无序序列的topK,是个经典问题。更具体的过程与图示,见参考文献1,不再重新画图。上面的代码,分别找到最大的三个数与最小的三个数。原创 2023-05-16 16:58:55 · 615 阅读 · 0 评论 -
二分查找及其变种大全详解
1.经典二分查找经典的二分查找,是对一个已排序的数组,通过查找数组中间位置元素值的大小与要查找的目标值大小进行对比,从而缩小数组的搜素范围,直到最后找到目标值出现的位置,或者将数组查找完毕一直没有找到目标值直至算法结束。其基本的算法框架为(c++版本)int binaray_search(int[] nums, int n, int target) { int left = ..., right = ..., mid; while(...) { int mid = (left+right)/2原创 2022-05-03 21:12:51 · 807 阅读 · 0 评论 -
RoaringBitmap分析及使用
1.bitmapbitmap是大数据处理中常用的一种数据结构,可以用来做去重与基数统计。考虑如下场景:有1千万个整数,整数的范围在1到1亿之间。如何快速判断某个整数是否在这1千万个整数中?如果用散列这种常见的数据结构,内存的占用肯定是非常大,基本不可用。如果开辟一个长度为1亿的整形数组,一个int型占用4个字节,最后算下来内存占用也很大。有的同学说可以将数组换成布尔数组,可以减小内存占用。对比整形,布尔型内存占用确实较小,但是很多语言中布尔型变量大小是1个字节,内存占用还是相当可观。实际上,表原创 2021-11-03 17:57:33 · 4200 阅读 · 0 评论 -
ConcurrentHashMap1.7到1.8变化
HashTable讲ConcurrentHashMap之前,稍微先说说HashTable。HashTable实现并发的方式,简单一句话总结就是,加synchronized同步锁。查看一下HashTable的源码,到处可见的synchronized关键字。 /** * Returns the number of keys in this hashtable. * * @return the number of keys in this hashtable.原创 2021-09-15 22:02:37 · 487 阅读 · 0 评论 -
双向链表与LinkedHashMap
1.双向链表比单向链表优势对于插入操作,单链表与双链表都是O(1)时间复杂度。对于删除操作,我们经常看到的说法是单链表的删除时间复杂度是O(1),其实这种说法不准确。因为单从删除这个动作来说,确实是O(1),只要把next指针的指向做改变即可。但是,在删除操作之前,我们需要找到前驱节点,这个操作就不是O(1),而是O(n)。具体来说,链表删除数据一般是两种情况:1.删除节点中值等于某个特定值的节点。2.删除给定指针指向的节点。对于第一种情况,不管单链表双链表,都需要从头节点开始挨个遍历,找到值等原创 2021-09-15 18:01:38 · 958 阅读 · 0 评论 -
查找算法小结
前言对数据进行查找是数据处理中一个最基本最常见同时也最重要的操作。那么常见的查找方法有哪些,怎么能够实现又好又快的查找方式呢?下面来做一个小结1.遍历,顺序查找如果数据没有任何特点可言,要在一堆数据比如一个一维数组中查找一个特定的数据,此一维数组没有规律。那么很自然想到的方法就是遍历该一维数组,然后与特定数据进行比较看是否相同。时间复杂度分析该特定数据有可能再数组开头,也有可能再数组的末...原创 2020-02-01 22:04:46 · 627 阅读 · 0 评论 -
二叉树递归非递归遍历,层次遍历,反转,输出路径等常见操作详细总结
1.序言在实际工作中,很多业务场景其实也需要一些比较巧妙的算法来支撑,并不是业务逻辑就全是复制粘贴或者说重复的代码写一百遍。越是随着算法研究的深入,越是发现数据结构的重要性。或者说,数据结构中就蕴藏着无数精妙算法的思想,很多算法的思想在数据结构中体现得非常突出。而作为一种非线性的数据结构,二叉树是非常重要非常常见也非常牛逼的一种数据结构,里面包含有递归,栈,队列,dfs等等很多常见的操作。因此,...原创 2019-01-01 22:59:40 · 2537 阅读 · 1 评论 -
java队列(Queue)用法总结
1.队列的特点队列是一种比较特殊的线性结构。它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中最先插入的元素也将最先被删除,对应的最后插入的元素将最后被删除。因此队列又称为“先进先出”(FIFO—first in first out)的线性表,与栈(FILO-first in last out)刚好相反...原创 2018-11-30 19:05:56 · 63460 阅读 · 2 评论 -
海量数据处理算法—Bloom Filter
1. Bloom-Filter算法简介Bloom-Filter,即布隆过滤器,1970年由Bloom中提出。它可以用于检索一个元素是否在一个集合中。Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。它是一个判断元素是否存在集合的快速的概率算法。Bloom Filter有可能会出现错误判断,但不会漏掉判断。也就是Blo转载 2017-11-26 00:00:08 · 920 阅读 · 0 评论 -
二叉树反转java实现
反转二叉树是数据结构中一种经典的操作。如下图所以,反转二叉树就是交换所有节点的左右子树。 具体代码实现如下:package com.xiaomi.tree;import java.util.LinkedList;import java.util.List;/** * Created by wanglei on 17/8/5. */public class Solution { pri原创 2017-08-05 18:07:06 · 4185 阅读 · 1 评论 -
归并排序 详解
1.归并排序简要介绍归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,归并排序将两个已排序的表合并成一个表。2.归并排序优缺点优点 1.归并排序的效率达到了巅峰:时间复杂度为O(nlogn),这是基于比较的排序算法所能达到的最高境界 2.归并排序是一种稳定的算法(即在排序过程中大小相同的元素能够保持排序前的顺序,321原创 2016-07-05 19:46:02 · 3548 阅读 · 0 评论 -
链表常见操作java实现二:反转链表,从尾到头倒序遍历
1.反转链表反转链表在面试中非常常见。例如: 将原链表: 0->1->2->3 反转为新链表: 3->2->1->0 反转链表的一般思路是使用三个指针。其中,一个指针为当前节点,一个指针指向当前节点的下一个节点,另外一个节点则指向新链表表头从而保存结果。public class Reversed_MyLinkedList { public static Node reversed_l原创 2016-08-08 22:40:06 · 13708 阅读 · 0 评论 -
链表常见操作java实现一:链表初始化,求链表长度
1.前言链表是一种非常基础也非常重要的数据结构,在实际中使用非常广泛,也是各种面试里特别容易出现的类型。尤其在各大IT公司的校招中,不管笔试还是面试,链表几乎都是必出现的题型。因此不管从实际工作场景中,还是在找工作的过程中,熟练掌握链表的相关操作都显得非常重要。看看wiki里给链表的介绍: 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在原创 2016-08-08 20:24:27 · 21773 阅读 · 0 评论 -
递归 非递归 遍历二叉树
二叉树的重要性,想必大家都非常清楚。在数据结构中,二叉树是一种非常重要,也非常基础的非线性结构。遍历是二叉树最基础也是最重要的操作了。最常见的分为前序遍历,中序遍历,后续遍历。废话不多说,先直接上代码。package tree;import java.util.ArrayList;import java.util.List;import java.util.Stack;public class原创 2016-07-04 18:16:34 · 860 阅读 · 0 评论