
数据结构与算法
文章平均质量分 91
null_null_bug
这个作者很懒,什么都没留下…
展开
-
leetcode 599. 两个列表的最小索引总和 求解思路
leetcode 599. 两个列表的最小索引总和 求解思路先来看下题目:599. 两个列表的最小索引总和假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺序。 你可以假设总是存在一个答案。示例 1:输入:["Shogun", "Tapioca Express", "Burger King", "KFC"]["Piatti", "原创 2021-02-28 11:51:39 · 277 阅读 · 0 评论 -
leetcode 599. 两个列表的最小索引总和 求解思路
先来看下题目:599. 两个列表的最小索引总和假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺序。 你可以假设总是存在一个答案。示例 1:输入:["Shogun", "Tapioca Express", "Burger King", "KFC"]["Piatti", "The Grill at Torrey Pines", "Hu原创 2021-02-26 09:09:19 · 333 阅读 · 0 评论 -
一致性哈希算法
一致性哈希算法一. 传统的哈希算法的局限性要了解一致性哈希算法,就得先了解传统的哈希算法在分布式场景下的局限性。哈希算法就是按键值对的存储,给定一个键,可以做到O(1)的时间复杂度内的数据查找。例如根据学生的学号查找学生的相关的信息。一种简单的存储形式就是以哈希表的形式来存储<code,studentinfo>。假如某个学校的学生太多了。一台机器上的哈希表已经存储不了。需要使用多台机器来进行存储学生信息,那这时该怎么办呢?这个最简单的办法就是使用哈希取模来确定,计算公式如下节点编号=h原创 2021-02-21 18:53:53 · 822 阅读 · 0 评论 -
单台机器上实现TB级的数据对比之数据合并
在单台机器上实现TB级的数据对比之数据合并整体思路在上一章节,我介绍了如何对切分后的数据进行并行排序,这节来到了最后的操作,数据的合并操作。将数据进行对比,找出添加的数据、修改的数据、删除的数据。需要特别处理下重复的数据。在第一章节我已经介绍了这个大致的思路,但未深入细节来讨论如何实现,这章将深入细节将数据合并的逻辑做一个完整的说明。这个逻辑看着有点复杂吧,那我来详细的解释下吧!在原始排序文件中读取所有文件的首行数据,并记录到以文件索引为下标的数组中。就叫它srcDataList在目标排原创 2021-02-17 09:50:30 · 406 阅读 · 0 评论 -
单台机器上实现TB级的数据对比之数据排序
在单台机器上实现TB级的数据对比之数据排序整体流程在上一个章节已经实现了对大型文件的拆分.今天来继续分享关于数据的排序。文件排序的逻辑不复杂。将数据读取进内存中然后排序。写入至磁盘中。由于这些文件相互完全不关联。可以并行化处理。那先还是看下整体的一个结构吧。这个主要涉及到以下内容:并行排序控制器,它的主要作用是控制向线程池中加入任务的数量。线程池,用来执行当前的排序任务。排序任务。将排序中涉及的到操作,封装到一个任务中。包括从文件中读取数据到内存,再将内存中的内容进行排序,最后再将排序后的原创 2021-02-17 09:46:41 · 405 阅读 · 0 评论 -
在单台机器上实现TB级的数据对比之数据切分
在单台机器上实现TB级的数据对比之数据切分文件切分的逻辑由于面对的原始文件可能是一堆小文件,也可能是一个很大文件,这第一步当然是对文件进行切割规整,统一大小为32M,这个32M是一个近似值,由于要保留完整的行,故这是一个接近值。那如何实现呢?分为两部分来说吧,第一部分是文件读取:读取目录下的文件,获得一个文件列表。列表使用数组来存储。将列表按文件名进行排序,获得数据读取文件的一个顺序,也就是数据的一个顺序。声明一个索引编号,编号从0开始,这个索引编号代表的就是当前正在读取的文件。按索引编号原创 2021-02-17 09:42:46 · 244 阅读 · 0 评论 -
在单台机器上实现TB级的数据对比
在单台机器上实现TB级的数据对比前几天我在做公司项目的时候,需要对数据进行比较。数据量不大,也就几千条而已。当时功能完成后,我开始思考一个问题。就是当对比的文件是特别大的时候,我还能实现吗?那现在对问题做出假设:问题:现在有两个超大文件集,原始数据集和目标数据集,每个文件集中都有超过1亿的记录,数据中存在重复的记录,编写一个程序,可以找出两个数据集之间的差异,求解出三类数据:原始数据集中存在,目标数据集中不存在,为待删除的数据记录。原始数据集中存在,目标数据集中也存在,但内容不一致,为待修改的记录原创 2021-02-07 15:52:39 · 314 阅读 · 0 评论 -
跳表加散列表实现有序的散列表(MySkipListHashMap)
跳表加散列表实现有序的散列表(MySkipListHashMap)介绍有序的,还是散列表,是不是听起来就觉得这不太现实啊!但现实往往就是这么打脸,听起来不可思议的东西,却是可以做到的。散列表,一个无序的数据结构。通过散列函数将数据散列分布到各个数据的槽里。那如何保证数据的有序呢?在java的库中有一个是实现的有序的数据结构LinkedHashMap,按照插入顺序来保存的有序,这个数据结构是通过散列表与双向链表的结合,来实现的一个保存数据。受此启发。我来实现一个按照数据的顺序来保存的有序数结构。操作:原创 2021-01-31 14:28:02 · 319 阅读 · 0 评论 -
手写LinkedHashMap
手写LinkedHashMap在上一篇博客,我实现一个MyHashMap,那今天继续来实现一个LinkedHashMap,LinkedHashMap相对于HashMap保存了数据插入的顺序,觉得神奇的,HashMap我们都知道,通过散列函数,将数据分散到不同的槽中,再从槽中去读取数据。这一过程听起来就是无法保证顺序的。那要如何保证插入的顺序呢?其实在LinkedHashMap中,加了下一个双向链表。 /** * HashMap.Node subclass for normal Link原创 2021-01-23 15:43:59 · 231 阅读 · 0 评论 -
跳表加散列表实现HashMap
自己实现HashMap在平时的开发中,jdk库中的HashMap是我们在平时的开发中用的非常多的容器之一,我常常在想,自己能否也实现一个呢?以前觉得非常的复杂,但当我学习了跳表,和散列表后,我觉得这个问题我可以尝试了,于是就开始了自己实现MyHashMap之旅。1. 需求定义既然要实现一个HashMap,那还是先需求吧。public class MyHashMap<K, V> { public MyHashMap(int capacity){} public void put(原创 2021-01-16 11:39:13 · 347 阅读 · 0 评论 -
快速排序
快速排序的基本思想快速排序也是利用分治的思想。如果需要排序的数据的下标是从s到t,在下标s到t之间的任意一个数据作为分区点p,遍历s到t之间的数据,将小于分区点的数据放到分区点p的左边,将大于分区点的数据放到分区点的右边,分区点放在中间,经过这一操作后。数据被分为3个部分,s到p-1之间为小于分区点的数据,p+1到t之间为大于分区点的数据,p为分区点。根据分治递归的处理思想,可以递归排序s到p-1的区间和p+1到t的区间,直到区间缩小为1,说明排序完成,所有数据都已经为有序。文字还是没有图直观:分区点原创 2021-01-08 18:08:26 · 294 阅读 · 0 评论 -
跳表
跳表针对链表这种数据数据结构,捎加改造,可以支持类似“二分”的查找算法,这就是跳表。如何理解跳表对于单链表来说,即使存储的数据是有序的,如果在链表中查找某个数据,也只能从头到尾依次遍历,时间复杂度会很高,是O(n)。对于单链表如何提高查找效率呢?可以类似图中如下做一级“索引”,这样子查询起来就会快很多,每两个节点抽取一个结点到上一级,可以把抽取出来的叫作索引。图中down表示down指针,指向下一级。以查找6为例,首先可以遍历一级索引,当遍历到节点为5时,索引的下一个节点为7,大于需查找到6,原创 2021-01-01 22:40:25 · 229 阅读 · 0 评论 -
leetcode 33. 搜索旋转排序数组
leetcode 33. 搜索旋转排序数组题目给你一个整数数组 nums ,和一个整数 target 。 该整数数组原本是按升序排列,但输入时在预先未知的某个点上进行了旋转。(例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 示例 1: 输入:nums = [4,5,6,7,0,1,2], target = 0输出:4示例 2: 输入:nums =原创 2020-11-28 11:56:54 · 214 阅读 · 0 评论 -
二分查找
二分查找算法描述二分查找也称折半查找(Binary Search),它是一种效率非常高效的查找方法。但是折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。那它的效率有多高呢?还在给一个直观的数据做个展示吧,在一个1到2亿的个有充数组内查找一个给定值,使用二分查找需要多少次呢?最多也只需要28次。##时间复杂度二分查找的时间复杂非常的高,那高效到什么程序呢?假设数据大小是n,每次查找都会缩小为原来的一半,即为除2操作,最坏情况下,直到查找区间缩小为空,才停止被查找到的大小区间原创 2020-11-21 15:50:32 · 2750 阅读 · 1 评论 -
学习笔记-数据结构与算法-归并排序
归并排序核心思想:将一个数组一分二,然后将两个数组分别排序,最后将两个有序数据合并,就完成了归并排序。归并排序使用的是分治思想,分而治之,将一个大问题分解为n个小问题,小问题解决了,大问题也就解决了。归并排序一般使用递归来实现,要写出递归代码的关键,写出递推公式,找到终止条件。归并排序的递推公式:merge_sort(p…r) = merge(merge_sort(p…q)...原创 2019-11-24 19:45:12 · 261 阅读 · 0 评论 -
学习笔记-数据结构与算法-插入排序
插入排序插入排序的原理:在一个已经有序的数组中,在插入一个数据后,如何继续让数据继续保持有序?这个很容易解决,先在有序的数组中找到待插入数据的位置,然后将其插入即可。也来画个图这就是插入排序的原理。插入是如何借助上面的原理来实现排序。将数据分为两个区间,已排序区间和未排序区间。初始已经排序数据仅一个数据。然后在未排序的数据中取一个元素在已经排序区间中查找...原创 2019-11-10 21:49:32 · 248 阅读 · 0 评论 -
学习笔记--数据结构与算法--冒泡排序
冒泡排序冒泡排序是一种基于比较的排序算法,每次冒泡操作都会比较相邻的两个数,检查是否满足大小关系,如果不满足就互换。一次冒泡操作至少让一个元素移动到家排序后所在的位置。重复n次就完成了排序。还是图比较直观,以5、3、8、2、7、1数据为例,来画个图。我的冒泡实现这是我最原始的实现,冒泡排序这样过程进行6次就完成了冒泡的排序这是我实现的冒泡排序的代码...原创 2019-11-04 13:02:32 · 265 阅读 · 0 评论 -
学习笔记--数据结构与算法--分析排序算法
排序算法的执行效率对于排序算法的执行效率一般会从这几个方面来衡量:最好、最坏、平均情况的复杂度。在分析排序算法的时间复杂度时,要分别给出最好情况、最坏情况、平均情况的时间复杂度。除此之外,还要说明最好和最坏的时间复杂度所对应的要排序的原始数据是什么样的。时间复杂度的常数、系数、低阶。时间复杂度返应的是数据规模n很大时候的一个增长趋势,所以它表示会忽略、系数、常数和低阶,但在软开发中...原创 2019-10-27 21:04:56 · 180 阅读 · 0 评论 -
如何在单台8G内存机器上实现1TB日志排序?
问题:最近在面试人的时候,我经常会问一个问题,题目如下:现在有一批日志数据,大小为1TB,数据是某一天的生产的日志数据,现在只有一台单CPU及8G内存的机器,请使用算法对此日志数据按时间的先后顺序进行排序。可面试了好多人,都没有回答出这个问题针对这个问题今天来讲讲这个问题我的解法。解决方案1:桶排序它的原理是利用分区字段的特点,将数据分别写入到多个桶文件中...原创 2019-07-26 18:39:10 · 3692 阅读 · 2 评论 -
leetcode32-最长括号匹配-栈实现
给定一个只包含 '('和 ')'的字符串,找出最长的包含有效括号的子串的长度。示例1:输入: "(()"输出: 2解释: 最长有效括号子串为 "()"示例 2:输入: ")()())"输出: 4解释: 最长有效括号子串为 "()()"来源:力扣(LeetCode)链接:https://leetcode-cn.com/proble...原创 2019-08-10 14:27:57 · 490 阅读 · 0 评论 -
栈
栈是一种操作受限的线性表,只允许在一端插入和删除数据。栈的实现:栈,即可以用数组来实现,也可以用链表来实现,使用数组来实现的栈叫顺序栈,使用链表来实现的栈叫链式栈。这是基于java语言来分别实现的顺序栈和链式栈.顺序栈 /*** 用数组实现一个顺序栈** <p>栈,先进后出,后进的先出** @author...原创 2019-08-17 15:43:31 · 243 阅读 · 0 评论 -
数据结构与算法-队列
队列特性操作特性:队列也是一种操作受限的线性表,只允许在一端插入和删除数据。跟栈一样,队列也可以使用数据来实现,还可以使用链表来实现。使用数组实现的队列叫做顺序队列,使用链表实现的队列叫做链式队列。顺序队列 /** * use array implement queue * * @author liujun ...原创 2019-08-26 09:01:10 · 161 阅读 · 0 评论 -
数据结构与算法-队列之leetcode练习(641,239,622)
设计实现双端循环队列641. Design Circular Deque Design your implementation of the circular double-ended queue (deque). Your implementation should support following operations: My...原创 2019-08-31 16:36:03 · 197 阅读 · 0 评论 -
学习笔记——数据结构与算法.递归
递归是一种非常广泛使用的编程技巧,递归非常的重要,很多的复杂算法的编码实现都通过递归来实现。搞懂递归非常的重要。示例假如你想知道到你这代是家族中第几辈了,这个时候你会去找你爸爸,你爸爸也不知道,就会找你爷爷。假如你爷爷知道,告诉了你爸爸,到你爷爷那代是第8辈了,然后你爷爷就会告诉你爸爸,到你爸爸那代是第9辈了,然后你的爸爸告诉你,到你这里已经是第10辈了。这就是一个递归的问题,去的过程...原创 2019-09-07 14:41:18 · 283 阅读 · 0 评论 -
数据结构与算法-递归-leetcode练习
递归编写递归要决,千万不要用人脑去递和归每一层,正确的做法是找到如何分解为子问题,然后几个子问题的关系是什么。然后翻译成代码。leetcode17题目描述: 给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例:...原创 2019-09-28 16:49:37 · 362 阅读 · 0 评论 -
自己动手实现搜索引擎之数据采集
自己动手实现搜索引擎之数据采集曾经在学生时代,就很想实现一个自己的搜索引擎,但当时没有这个技术,偶然的一个机会,有幸参加了王争老师的《数据结构与算法之美》的课程,在这个专栏里,我感觉通过几个月的练习,觉得自己的数据结构与算法,有了很大的进步,老师还特别分享了自己动手实现一个搜索引擎的原理以及关键的技术点,通过这个的学习,我了解了一个简单的搜索引擎的原理与实现,我也就将自己动手实现搜索引擎的技术...原创 2019-08-03 15:43:19 · 1311 阅读 · 0 评论