Skip to content

【014-week1】学习总结 #94

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
aiter opened this issue Apr 19, 2019 · 2 comments
Open

【014-week1】学习总结 #94

aiter opened this issue Apr 19, 2019 · 2 comments

Comments

@aiter
Copy link

aiter commented Apr 19, 2019

04.19

基础

数组

  • 内存中连续的存储空间
  • 适合指定下标获取元素
  • 中间插入、删除后,移动后续的元素,都需要较高的时间成本
  • 固定大小,需要扩容时,需要一块新的内存空间,而且需要复制元素的时间成本
  • 无序数组,
  • 有序数组,要使用二分查找,都必须是有序的数组,如果是不变化的数组,要多次查找,一般采用1次排序,多次查询
  • 典型场景

固定范围(可以通过O(1)映射到具体的数组下标),比如只有小写字母的一个字符串,每个a-z的字符k,可以通过k-a直接映射到数组下标,再通过下标直接获取元素

链表

  • 每个节点,独立存在内存中(可以不连续),通过指针/引用建立节点之间的关系
  • 插入、删除节点容易
    • 如果指定一个节点value去删除一个元素,首先得通过遍历,查找到这个节点
    • 如果指定一个节点的前序指针/应用,那么删除就不需要遍历查找(单链表,双链表都可以),
    • 如果指定一个节点的指针/引用 ,单链表还是需要遍历找到该节点的前序节点,才能删除;这种情况双向链表就不再需要遍历查询的步骤

特殊的后进先出,常用的场景对栈的操作也比较简单,入栈push,出栈pop,查看栈顶元素peek,使用场景也比较特殊,比如常见的:表达式的合法性检查、浏览器的前进后退;基本也不会对栈进行排序、查找等操作。可以进一步自己使用数组、链表自己实现一个栈。(后面根据Leetcode的题练习一下其他的使用场景)

递归
有2点真的很重要

  • 终止条件
  • 思维上一定要"信任"下一层的递归结果,不用把自己带入下一层的逻辑中

排序

以前学习排序,老是去记各种排序算法的具体实现,没有总结特殊、使用背景,一段时间就忘记。这次根据老师分析的时间复杂度、是否是稳定性排序、是否是原地排序;为什么要用稳定排序,像订单排序中,先用订单号(不重复)排序,再用金额(重复)排序,后面的用金额排序就需要用稳定排序。归并、快排都是利用分治思想,快排不稳定,归并不是原地排序,都需要根据场景来决定排序,不死记硬背。

二分查找

基本都是使用在排序好的数组上?

  • 有序的才有意义,否则不好比较
  • 数组能快速容易的用下标折半定位

进阶

  • 更多的场景是有相同的元素,注意边界条件
  • 大于某个数的第一个元素的查找等

学习态度

追求掌握,训练思维,有没学会自己最清楚;一定要动手实现

@tolookme
Copy link
Contributor

知识点总结的比较细致。

@GUOSF
Copy link
Contributor

GUOSF commented Apr 20, 2019

读完你的,我有复习一把,和我的理解对比下,有收获。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants