第一章、算法概论
1、数据结构
概念:
数据结构,对应的英文单词是data structure,是数据的组织、管理和存储格式,其使用目的是为了高效地访问和修改数据。
数据结构的组成方式:
- 线性结构(数组、链表、栈、队列、哈希表)
- 树(二叉树、哈夫曼树)
- 图(多对多)
2、算法
前言:运行时间的长短和占用内存空间的大小,是衡量程序好坏的重要因素。
-
时间复杂度
- 时间复杂度是对一个算法运行时间长短的量度,用大O表示,记作T(n)=O(f(n))。
- 常见的时间复杂度按照从低到高的顺序,包括O(1)、O(logn)、O(n)、O(nlogn)、O(n2)等。
- 方法:只保留时间函数中的最高阶项,如果最高阶项存在,则省去最高阶项前面的系数。
-
空间复杂度
- 概念:程序占用空间大小的计算公式记作S(n)=O(f(n)),其中n为问题的规模,f(n)为算法所占存储空间的函数。
- 空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,用大O表示,记作S(n)=O(f(n))。
- 常见的空间复杂度:
- 常量空间 O(1)
- 线性空间 O(n)
- 二维空间 O(n2)
- 递归空间(递归算法的空间复杂度和递归深度成正比。)
- 递归:
- 递归是一个比较特殊的场景。虽然递归代码中并没有显式地声明变量或集合,但是计算机在执行程序时,会专门分配一块内存,用来存储“方法调用栈”。
- “方法调用栈”包括进栈和出栈两个行为。
- 当进入一个新方法时,执行入栈操作,把调用的方法和参数信息压入栈中。
- 当方法返回时,执行出栈操作,把调用的方法和参数信息从栈中弹出。
第二章、数据结构基础
1、数组
(1)概念
数组对应的英文是array,是有限个相同类型的变量所组成的有序集合,数组中的每一个变量被称为元素。
(2)基本操作
-
读取元素:根据下标O(1)
-
更新元素:根据下标O(1)
-
插入元素:O(n)
- 尾部插入
- 中间插入
- 超范围插入
-
删除元素:O(n)
(3) 数组的优势和劣势
- 优势:数组拥有非常高效的随机访问能力(读取和更新),如二分查找。
- 插入和删除效率低
- 数组所适合的是读操作多、写操作少
2、链表
(1)概念:
链表(linked list)是一种在物理上非连续、非顺序的数据结构,由若干节点(node)所组成。
(2)构成:
链表的每一个节点又包含两部分,一部分是存放数据的变量data,另一部分是指向下一个节点的指针next。
(3)分类:
-
单向链表
-
双向链表
(4)区别:
- 数组在内存中的存储方式是顺序存储,
- 链表在内存中的存储方式则是随机存储
(5)基本操作
-
查找节点 O(n)
-
更新节点 O(1)
-
插入节点 O(1)
- 尾部插入
- 头部插入
- 中间插入
-
删除元素 O(1)
- 尾部删除
- 头部删除
- 中间删除
(6)链表的优势和劣势
- 插入删除快
- 查找慢
- 链表所适合的是:读操作少、写操作多
3、栈和队列
1、栈
(1)概念
- 栈(stack)是一种线性数据结构。最早进入的元素存放的位置叫作栈底(bottom),最后进入的元素存放的位置叫作栈顶(top)。
- 特点:先进后出
- 栈这种数据结构既可以用数组来实现,也可以用链表来实现。
(2)基本操作
-
入栈O(1)
入栈操作(push)就是把新元素放入栈中,只允许从栈顶一侧放入元素,新元素的位置将会成为新的栈顶。
-
出栈O(1)
出栈操作(pop)就是把元素从栈中弹出,只有栈顶元素才允许出栈,出栈元素的前一个元素将会成为新的栈顶。
2、队列
(1)概念
- 栈(stack)是一种线性数据结构。最早进入的元素存放的位置叫作栈底(bottom),最后进入的元素存放的位置叫作栈顶(top)。
- 特点:先进先出
- 栈这种数据结构既可以用数组来实现,也可以用链表来实现。
(2)基本操作
-
入队O(1)
入队(enqueue)就是把新元素放入队列中,只允许在队尾的位置放入元

本文深入介绍了数据结构与算法的基础知识,包括数组、链表、栈、队列、散列表等,分析了它们的时间复杂度和空间复杂度。详细阐述了递归、二叉树、二叉堆、排序算法(冒泡排序、快速排序等)以及最大公约数的计算方法。同时,探讨了如何用栈实现队列、寻找全排列的下一个数等问题,并讨论了动态规划和贪心算法在解决实际问题中的应用。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



