时间复杂度

数据结构和算法 链表

随声附和 提交于 2019-12-09 19:38:17
一、单向循环链表 1、链表是一种数据结构,链表的基本组成单元是节点(Node)。节点(Node)包含了:节点数据(val/element)、后一个节点的引用(next)、前一个节点的引用(pre) 2、链表在内存中存储空间是不连续的,每一个节点都包含后一个节点的引用(next)和前一个节点的引用(pre),通过next和pre可以获取在不连续空间存储的节点 3、时间复杂度分析:一、添加和删除的操作:链表的时间复杂度则变成了O(1);二、遍历查找需要的数据::链表的时间复杂度则变成了O(n) 4、链表还是很多算法中有运用,哈希表就是基于链表来解决哈希冲突 5、链表实现:初始化(__init__)、元素的插入和删除(add、append、insert、remove)、链表的遍历(travel)、获取链表长度(length)、元素的查询(search)、链表的逆序、判断链表是否有环(链表是否有环:链表不存在一个结点的next指针是 null-hash表set.add(head)存储节点的引用和快慢指针) 6、while判断,head是否为none,适用于head=head.next;head.next是否为none,适于与head=head.next.next 7、以下python实现代码中 def insert(self, pos, item) 插入链表使用 数字索引 表示位置

十大排序算法之堆排序

佐手、 提交于 2019-12-09 18:21:40
简介 堆积排序(Heapsort)是指利用堆积树(堆)这种资料结构所设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。堆排序是不稳定的排序方法,辅助空间为O(1), 最坏时间复杂度为O(nlog2n) ,堆排序的堆序的平均性能较接近于最坏性能。 实例 Java 代码 public class Main { public static void main ( String [ ] args ) { int [ ] sort = { 3 , 2 , 1 , 4 , 6 , 5 , 8 , 9 , 10 , 7 } ; System . out . println ( "排序前:" ) ; printArray ( sort ) ; heapSort ( sort ) ; System . out . println ( "\n排序后:" ) ; printArray ( sort ) ; } public static void printArray ( int [ ] a ) { for ( int i = 0 ; i < a . length ; i ++ ) { System . out . print ( a [ i ] + " " ) ; } System . out . println ( ) ; } public static void heapSort (

「前端长列表」开源库解析及最佳实践

偶尔善良 提交于 2019-12-09 12:08:29
前言 长列表一般也叫虚拟列表,是一种大数据量下只渲染可见节点避免页面卡顿的优化方案 长列表也有时间分片的做法,比较少用,感兴趣的可以看 高性能渲染十万条数据(时间分片) 前端比较有名的有两个项目: react-window vue-virtual-scroller 以及 Ant Design 4 的 virtual-list 本文将对这些开源库进行剖析,分析实现原理,并进行各个指标的评估,最终实现一个高可用的长列表组件 主要评估以下几点: 渲染:回流, 渲染策略等 计算:起止项和偏移位置的计算,总高度的计算 功能:自适应高度,其他 健壮:是否存在鼠标与滚动条不同步的 bug(计算时总高度增加了,则滚动条会相对鼠标向上) 然后说下看源码的策略,主要看这几点: dom 结构 查找起始位置 计算偏移距离 计算总高度 长列表入门 如果还不清楚长列表是什么,可以先看下这篇文章 「前端进阶」高性能渲染十万条数据(虚拟列表) 一张图快速入门 下面我们来看看其他开源库都怎么做的 vue-virtual-scroller 项目地址 功能: 支持自适应高度,横向滚动,图片自适应高度 渲染 dom 结构如下 <!-- position: relative;overflow-y: auto; --> < div class = " vue-recycle-scroller " > < div class

数据结构导论 二 时空性

人走茶凉 提交于 2019-12-08 21:03:31
通过上一章, https://www.cnblogs.com/X404/p/11984707.html 中可以知道数据结构分为 1.逻辑结构 包含: 1)集合 2)线性结构 3)树形结构 4)图结构 2.存储结构 1)顺序存储 2)链式存储 3)索引存储 4)散列存储 以上也是重点需要进行了解的, 废话不多说,跟着第一章走,算法的设计应该满足一下: 1.正确性 :保证是否正确 2.易读性:是否简单易懂 3.健壮性:在输入非法数据时,是否出错 4.时空性:分析 时间复杂度 和空间复杂度 提高算法效率(重点) 选择最优算法的2各度量: 时间复杂度:算法运行时所需要的总步数(从开始运行到打断点) 空间复杂度:算法执行时所占的存储空间(运行后存储空间的大小) 合理地选择一种或者几种操作作为“标准操作” 确定每个算法执行了多少次标准操作,并将此次数规定位该算法的计算量 时间复杂度的确定计算量: 算法的最坏情况时间复杂度:算法在所有输入下的计算量的最大值为计算量 (最坏时间复杂度是相当于运动会的接力棒,从开始到结束总共用的时间被称为最坏时间复杂度) 算法的平均情况时间复杂度:算法在所有输入下的计算量的加权平均值算法的计算量 (平均情况时间复杂度,仍可以用运动会接力来说,在一段时间内,所平均的值称为 加权平均) 最坏情况时间复杂度和平均情况复杂度统称为时间复杂度 最坏情况时间复杂度

海量数据分析问题总结

大兔子大兔子 提交于 2019-12-08 19:11:38
1)给⼀个超过100G⼤⼩的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? 第一题:首先我们的思路就是利用哈希进行文件的切分,我们把100G大小的logfile分为1000份,那么下来差不多没一个文件就是100M左右,然后再利用哈希函数除留余数的方法分配到对应的编号文件中,然后得出每个文件中出现次数最多的IP,然后堆排序取得这1000个ip中出现次数最多的。 2)与上题条件相同,如何找到top K的IP?如何直接⽤Linux系统命令实现? 这一道题的思路就是我们从题意可以看到这道题是来找top K的IP,topK我们的思路就是用堆来实现,找Top,就需要用小堆,这个是根据对的数据特性,我们建立成小堆,然后每次和堆顶最小的进行比较,然后再次进行向上调整,最后,就可以得到一个堆顶是最小IP,的一个小堆,这个小堆就是我们需求的K个IP,需要建的是K个节点的堆。 3)给定100亿个整数,设计算法找到只出现⼀次的整数! 由于是整数,所以我们采取的思路就是我们可以采用位图,100亿个整数,大致就是需要1.25G的内存进行存储。一个数字必须要2个位来进行表示状态,比如说,00表示不存在,01表示存在一次,10表示存在多次。这样就可以全部表示出每一个数存在的状态,这里我们就需要的内存是2.5G。 4)给两个⽂件,分别有100亿个整数,我们只有1G内存,如何找到两个

海量数据处理问题

ⅰ亾dé卋堺 提交于 2019-12-08 19:11:12
海量数据处理问题 海量数据处理问题的解题关键 分而治之,通过hash函数将大任务分流到机器,或分流为小文件 常用hashMap或bitmap 1.海量日志数据,提取出某日访问百度次数最多的那个IP. 访问百度的日志中取出IP,逐个写入一个大文件中,采用映射的方法,比如说模1000,将大文件映射成1000个小文件,再找出每个小文件中出现频率最大的IP,以及相应的频率(构建IP为key,出现频率为value的Hash Map)。然后在这1000个最大的IP,然后找出频率最大的IP(通过内排序算法)。 2.搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255个字节,假设目前有1000W个记录(其中有大量的重复,去重后大约还剩300W个, 一个查询的重复度越高,该记录越热门),请统计当前最热门的10个查询串,要求使用内存不能超过1G. Top K算法: 1.对这些海量数据进行批处理,在O(n)的时间内使用hash表完成统计()。 2.借助于堆,找出Top K,时间复杂度为N LogK (此时N为300W)。 3.有一个1G大小的文件,里面的每一行是一个词,词的大小不超过16个字节,内存限制大小事1M,返回频度最高的100个词。 顺序读取文件,对于每个词x,取hash(x)%5000存到500个小文件当中,每个小文件大概是200K左右

大数据处理

有些话、适合烂在心里 提交于 2019-12-08 19:03:47
海量数据处理问题汇总及方法总结 面试题中总是有好多海量数据的处理问题,在这里列出一些常见问题,便于以后查阅: 类型1:hash映射+hash统计+堆排序 1、 给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。 可以估计每个文件安的大小为5G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 分而治之/hash映射:遍历文件a,对每个url求取 ,然后根据所取得的值将url分别存储到1000个小文件(记为 )中。这样每个小文件的大约为300M。遍历文件b,采取和a相同的方式将url分别存储到1000小文件中(记为 )。这样处理后,所有可能相同的url都在对应的小文件( )中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。 hash统计:求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。 2、有10个文件,每个文件1G, 每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。要你按照query的频度排序 方案1: hash映射:顺序读取10个文件

大数据处理方案

那年仲夏 提交于 2019-12-08 18:58:46
场景一 海量日志数据,提取出某日访问百度次数最多的那个IP 首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP。 算法思路:分治法+Hash IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理; 可以考虑采用分治法,按照IP地址的Hash(IP)%1024值,把海量IP日志分别存储到1024个小文件中。这样,每个小文件最多包含4MB个IP地址; 对于每一个小文件,可以构建一个IP为key,出现次数为value的Hash map,同时记录当前出现次数最多的那个IP地址; 可以得到1024个小文件中的出现次数最多的IP,再依据常规的排序算法得到总体上出现次数最多的IP; 场景二 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。)

海量数据处理面试题集锦

ぐ巨炮叔叔 提交于 2019-12-08 18:51:22
本文参考链接: https://blog.csdn.net/u013949069/article/details/78056102?utm_source=copy 问题1 一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。 之前在此文, 海量数据处理面试题集锦与Bit-map详解 中给出的参考答案:用Trie树统计每个词出现的次数,时间复杂度是O(n le)(le表示单词的平均长度),然后是找出出现最频繁的前10个词。也可以用堆来实现(具体的操作可参考第三章、寻找最小的k个数),时间复杂度是O(n lg10)。所以总的时间复杂度,是O(n le)与O(n lg10)中较大的哪一个。 2. 在链接 https://blog.csdn.net/v_july_v/article/details/6685962 中作者总结了各种解法,值得好好看看~~~ 来源: CSDN 作者: Allenlzcoder 链接: https://blog.csdn.net/Allenlzcoder/article/details/82839416

大数据量获取TopK的几种方案

偶尔善良 提交于 2019-12-08 18:34:29
一:介绍 生活中经常会遇到求TopK的问题,在小数据量的情况下可以先将所有数据排序,最后进行遍历。但是在大数据量情况下,这种的时间复杂度最低的也就是O(NlogN)此处的N可能为10亿这么大的数字,时间复杂度过高,那么什么方法可以减少时间复杂度呢,以下几种方式,与大家分享。 二:局部淘汰法 -- 借助“冒泡排序”获取TopK 思路: 可以避免对所有数据进行排序,只排序部分 冒泡排序是每一轮排序都会获得一个最大值,则K轮排序即可获得TopK 时间复杂度空间复杂度 时间复杂度:排序一轮是O(N),则K次排序总时间复杂度为:O(KN) 空间复杂度:O(K),用来存放获得的topK,也可以O(1)遍历原数组的最后K个元素即可。 ps:冒泡排序请参考 : https://blog.csdn.net/CSDN___LYY/article/details/81478583 代码比较简单就不贴了,只要会写冒泡就ok了 三:局部淘汰法 -- 借助数据结构"堆"获取TopK 思路: 堆:分为大顶堆(堆顶元素大于其他所有元素)和小顶堆(堆顶其他元素小于所有其他元素) 我们使用小顶堆来实现,为什么不适用大顶堆下面会介绍~ 取出K个元素放在另外的数组中,对这K个元素进行建堆 ps:堆排序请参考: https://blog.csdn.net/CSDN___LYY/article/details