近来有小伙伴问我:刷leetcode真的有用吗,觉得收益很小,越刷越迷茫了...
诚然每个人刷题的目的不一样,233酱还不是为了能水几篇文章...
当然不止。我觉得刷题是一件有意思的事,就像小猫小狗咬自己尾巴,玩弄的不亦乐乎。比喻可能不太恰当,是有种沉迷小游戏的感觉。可是在艰难打野的过程中,我们不要忘了,最重要的是:了解每种技能包的特点,适合解决的问题和场景。在特定实战场景下能够使用特定的技能包,自创技能包。这才是武功的至高境界。
装X结束,浅谈开始。。
数据结构是指:一种数据组织、管理和存储的格式,它可以帮助我们实现对数据高效的访问和修改。
数据结构 = 数据元素 + 元素之间的结构。
如果说数据结构是造大楼的骨架,算法就是具体的造楼流程。流程不同,效率资源不同。我会两者结合简单探讨下他们的特点和应用。
常见的数据结构可分为:线性结构、树形结构 和 图状结构。
常见的算法有:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法等。
本文从 线性数据结构、递归 和 排序算法 谈起。
###线性结构
线性结构:是指数据排成像一条线一样的结构。每个元素结点最多对应一个前驱结点和一个后继结点。如数组, 链表,栈 ,队列等。
####数组
数组是是由相同类型的元素(element)的集合所组成的数据结构,分配一块连续的内存来存储。利用元素的下标位置可以计算出该元素对应的存储地址。
优点: 分配基于连续内存,是一种天生的索引结构,查询修改元素的效率O(1)。同时可以借助 CPU 的缓存机制,预读数组中的数据,所以访问效率更高。
缺点: 数组的索引优点也是它的缺点,因为它的索引是基于一块连续内存元素存储的位置下标决定的,增删arr[i]时间复杂度O(n),需要整体移动数组arr[i-n-1]的位置。此外,分配大数组会占用较大的内存。
可通过以下方式避免元素拷贝和占用大的开销:
1.懒删除:删除时只标记元素被删除,并不真正的执行删除。当数组整体内存不够用时,再执行真正的删除。 2.分块思想:将一大块内存分为n个小块,以 小块 为单位进行数组内存的拷贝。如Mysql的InnoDB引擎中每个Buffer Pool实例由若干个chunk组成,实际内存申请操作以chunk为单位。 3.缩容:曾经面试阿里时,就让设计了一个缩容版的HashMap。浪费可耻,节约光荣。 4.链表。
####链表
链表的存在就是为了解决数组的增删复杂耗时,内存占用较大的问题。它并不需要一块连续的内存空间,它通过 指针 将一组零散的内存块串联起来。根据指针的不同,有单