随笔分类 -  数据结构与算法笔记

基于极客时间《数据结构与算法之美》课程做的笔记和自己的一些总结
摘要:最经典、常用的排序: 提问:插入排序和冒泡排序的时间复杂度相同,都是O(n2),在实际开发中,为什么更倾向于使用插入排序? 如何分析一个“排序算法”? 排序算法的执行效率 1.最好、最坏、平均情况时间复杂度 这样区分的原因: 1)有些排序算法会区分,为了好对比。 2)不同有序度的数据对排序执行有影响 阅读全文
posted @ 2019-04-15 09:50 夏天换上冬装 阅读(244) 评论(0) 推荐(0)
摘要:如何理解“递归” 比如在电影院不知道自己现在坐的位置是第几排,就问下前排的是第几排(x),自己就是x+1,如果他也不知道他就继续问前排,知道问道第一排的人,这是“递”。 而第一排的人往会一排排传自己是第几排,这就是“归”。 递推公式就是如下: f(n)=f(n-1)+1 其中,f(1)=1 改成代码 阅读全文
posted @ 2019-04-07 22:37 夏天换上冬装 阅读(158) 评论(0) 推荐(0)
摘要:队列(queue) 先进者先出,这就是典型的“队列” 栈有基本操作入栈push()和出栈pop() 队列也有两个基本操作入队enqueue(),放一个数据到队列的尾部;出队dequeue(),从队列头部取一个元素。 所以,队列和栈一样,也是一种操作受限的线性表数据结构。 顺序队列和链式队列 用数组实 阅读全文
posted @ 2019-03-30 17:17 夏天换上冬装 阅读(261) 评论(0) 推荐(0)
摘要:我们可以用栈实现浏览器的前进后退功能 那么栈又是什么? 栈就像一叠盘子,从下一个一个往上放。后进先出,先进后出,就是典型栈的结构。 从操作特性上来看,栈是十分受限制的一种数据结构,只有一端能够操作,但因为只暴露了一端的操作接口,便不容易出错,更可控。因此当数据集合满足先进后出,后进先出的特点时,就应 阅读全文
posted @ 2019-03-25 10:22 夏天换上冬装 阅读(339) 评论(0) 推荐(0)
摘要:写好链表的代码 1.理解指针(引用)的含义 将变量赋值个指针,实际上就是将这个变量的地址赋值给指针 p->next = q : p结点的next指针存储了q结点的内存地址 p->next = q->next->next : p结点的next指针存储了q结点的下下一个结点的内存地址 2.警惕指针丢失和 阅读全文
posted @ 2019-03-17 20:07 夏天换上冬装 阅读(195) 评论(0) 推荐(0)
摘要:对比数组,链表不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用。 链表有单链表、双链表、循环链表 单链表 将零散的内存块(被称为结点)串联在一起,每个链表的节点除了存储数据外还要存储下一个结点的指针,记录下一个结点的指针成为后继指针。 头结点和尾结点比较特殊,头结点记录链表的基 阅读全文
posted @ 2019-03-06 17:53 夏天换上冬装 阅读(192) 评论(0) 推荐(0)
摘要:为什么数组要从0开始变好,而不是1开始呢? 数组是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据结构。 随机访问 插入、删除数据很低效 面试题: 数组和链表的区别? 链表适合插入、删除,时间复杂度为O(1);数组支持随机访问,根据小标随机访问的时间复杂度为O(1) 数组的内 阅读全文
posted @ 2019-03-04 20:11 夏天换上冬装 阅读(183) 评论(0) 推荐(0)
摘要:最好、最坏情况时间复杂度 1 // n 表示数组 array 的长度 2 int find(int[] array, int n, int x) { 3 int i = 0; 4 int pos = -1; 5 for (; i < n; ++i) { 6 if (array[i] == x) 7 阅读全文
posted @ 2019-03-03 11:30 夏天换上冬装 阅读(192) 评论(0) 推荐(0)
摘要:复杂度分析是整个算法学习的精髓 为什么需要复杂度分析? 算法执行效率评估: 事后统计法: 1.测试结果非常依赖测试环境 2.测试结果受数据规模影响很大 因此需要一个不用具体的测试数据来测试,就可以粗略估算算法执行效率的方法 大O复杂度表示法 每行代码>cpu>读数据-运算-写数据 :unit_tim 阅读全文
posted @ 2019-03-01 21:39 夏天换上冬装 阅读(196) 评论(0) 推荐(0)