![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法之美
文章平均质量分 55
sun*san
满怀希望才能披荆斩棘
展开
-
数据结构与算法之美笔记14(跳表)
我们可以先在索引层遍历,当遍历到索引层中值为13的结点时,我们发现下一个结点是17,那要查找的结点16肯定就在这两个结点之间。这样,原来如果要查找16,需要遍历10个结点,现在只需要遍历7个结点。我们在跳表中查询某个数据的时候,如果每一层都要遍历m个结点,那在跳表中查询一个数据的时间复杂度就是O(m*logn)。每两个结点会抽出一个结点作为上一级索引的结点,那第一级索引的结点个数大约就是n/2,第二级索引的结点个数大约就是n/4,第三级索引的结点个数大约就是n/8,依次类推,也就是说,原创 2022-09-04 19:22:52 · 80 阅读 · 2 评论 -
数据结构与算法之美笔记13(二分查找)
二分查找的底层需要依赖数组这种数据结构,而数组为了支持随机访问的特性,要求内存空间连续,对内存的要求比较苛刻。比如,我们有1GB大小的数据,如果希望用数组来存储,那就需要1GB的连续内存空间。注意这里的“连续”二字,也就是说,即便有2GB的内存空间剩余,但是如果这剩余的2GB内存空间都是零散的,没有连续的1GB大小的内存空间,那照样无法申请一个1GB大小的数组。而我们的二分查找是作用在数组这种数据结构之上的,所以太大的数据用数组存储就比较吃力了,也就不能用二分查找了。原创 2022-09-04 14:26:13 · 200 阅读 · 0 评论 -
数据结构与算法之美笔记12
如果对小规模数据进行排序,可以选择时间复杂度是O(n2)的算法;如果对大规模数据进行排序,时间复杂度是O(nlogn)的算法更加高效。所以,为了兼顾任意规模数据的排序,一般都会首选时间复杂度是O(nlogn)的排序算法来实现排序函数。原创 2022-09-04 14:19:53 · 85 阅读 · 0 评论 -
数据结构与算法之美笔记11
桶排序,顾名思义,会用到“桶”,核心思想是将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。如果要排序的数据有n个,我们把它们均匀地划分到m个桶内,每个桶里就有k=n/m个元素。每个桶内部使用快速排序,时间复杂度为O(k * logk)。m个桶排序的时间复杂度就是O(m * k * logk),因为k=n/m,所以整个桶排序的时间复杂度就是O(n*log(n/m))。原创 2022-09-04 14:00:02 · 63 阅读 · 0 评论 -
数据结构与算法之美10(排序)
如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。当T(n/2^k)=T(1)时,也就是n/2^k=1,我们得到k=log2n。如果我们用大O标记法来表示的话,T(n)就等于O(nlogn)。所以归并排序的时间复杂度是O(nlogn)。分治,顾名思义,就是分而治之,将一个大问题分解成小的子问题来解决。小的子问题解决了,大问题也就解决了。最坏情况下的时间复杂度是O(n2),但是平均情况下时间复杂度都是O(nlogn。原创 2022-09-03 08:31:56 · 109 阅读 · 0 评论 -
数据结构与算法之美09(排序)
最经典的、最常用的:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。原创 2022-09-03 08:21:27 · 157 阅读 · 0 评论 -
数据结构与算法之美08(递归)
所以除了f(1)=1这一个递归终止条件外,还要有f(0)=1,表示走0个台阶有一种走法,不过这样子看起来就不符合正常的逻辑思维了。所以,我们可以把f(2)=2作为一种终止条件,表示走2个台阶,有两种走法,一步走完或者分两步来走。所以n个台阶的走法就等于先走1阶后,n-1个台阶的走法 加上先走2阶后,n-2个台阶的走法。如果有7个台阶,你可以2,2,2,1这样子上去,也可以1,2,1,1,2这样子上去,总之走法有很多,那如何用编程求得总共有多少种走法呢?所以,递归终止条件就是f(1)=1,f(2)=2。原创 2022-09-03 08:15:35 · 89 阅读 · 0 评论 -
数据结构与算法之美07(队列)
,放一个数据到队列尾部;,从队列头部取一个元素。原创 2022-09-03 08:10:43 · 109 阅读 · 0 评论 -
数据结构与算法之美笔记06(栈)
从栈的操作特性上来看,,只允许在一端插入和删除数据。。实际上,栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫作,用链表实现的栈,我们叫作。如何实现浏览器的前进、后退功能?其实,用两个栈就可以非常完美地解决这个问题。我们使用两个栈,X和Y,我们把首次浏览的页面依次压入栈X,当点击后退按钮时,再依次从栈X中出栈,并将出栈的数据依次放入栈Y。当我们点击前进按钮时,我们依次从栈Y中取出数据,放入栈X中。当栈X中没有数据时,那就说明没有页面可以继续后退浏览了。原创 2022-09-03 08:02:16 · 126 阅读 · 0 评论 -
数据结构与算法之美笔记05(链表)
我们需要进行下面这样的特殊处理,其中head表示链表的头结点。所以,从这段代码,我们可以发现,对于单链表的插入操作,第一个结点和其他结点的插入逻辑是不一样的。我们希望在结点a和相邻的结点b之间插入结点x,假设当前指针p指向结点a。,要先将结点x的next指针指向结点b,再把结点a的next指针指向结点x,这样才不会丢失指针,导致内存泄漏。如果我们在结点p后面插入一个新的结点,如果要删除结点p的后继结点,代码逻辑在处理头结点和尾结点的时候,是否能正常工作?但是,如果我们要删除链表中的最后一个结点,原创 2022-09-03 07:58:26 · 95 阅读 · 0 评论 -
数据结构与算法之美笔记04(链表)
链表是内存空间不连续的数据结构。我们把内存块称为链表的“”。为了将所有的结点串起来,每个链表的结点除了存储数据之外,还需要记录链上的下一个结点的地址。如图所示,我们把这个记录下个结点地址的指针叫作。我们习惯性地把第一个结点叫作,把最后一个结点叫作。其中,头结点用来记录链表的基地址。有了它,我们就可以遍历得到整条链表。而尾结点特殊的地方是:指针不是指向下一个结点,而是指向一个,表示这是链表上最后一个结点。为链表的存储空间本身就不是连续的。所以,在链表中插入和删除一个数据是非常快速的。原创 2022-09-03 07:53:04 · 182 阅读 · 0 评论 -
数据结构与算法之美笔记03
数组用一块连续的内存空间,来存储相同类型的一组数据,最大的特点就是支持随机访问,但插入、删除操作也因此变得比较低效,平均情况时间复杂度为O(n)。在平时的业务开发中,我们可以直接使用编程语言提供的容器类,但是,如果是特别底层的开发,直接使用数组可能会更合适。原创 2022-09-03 07:44:31 · 70 阅读 · 0 评论 -
数据结构与算法之美02
最好情况时间复杂度(best case time complexity)、最坏情况时间复杂度(worst case time complexity)、平均情况时间复杂度(average case time complexity)、均摊时间复杂度(amortized time complexity)那么T(n)=T1(n)+T2(n)=max(O(f(n)), O(g(n))) =O(max(f(n), g(n))).平均情况时间复杂度就是加上每种情况发生的概率,更加严谨,例如。这个值就是概率论中的。原创 2022-09-03 07:39:40 · 114 阅读 · 0 评论 -
数据结构与算法之美笔记01
从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。数据结构和算法是相辅相成的。因此,我们无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构。原创 2022-09-03 07:26:45 · 121 阅读 · 0 评论