算法数据结构学习
==
---
![大纲](http://assets.processon.com/chart_image/6230997cf346fb07f92e8ec1.png?_=1647354637634)
[链表](/src/main/java/com/yzd/algorithm/linked)
* [单链表反转(206)](/src/main/java/com/yzd/algorithm/linked/DeleteNodeN.java)
* [链表中环的检测(141)](/src/main/java/com/yzd/algorithm/linked/DetectionOfRing.java)
* [两个有序的链表合并(21)](/src/main/java/com/yzd/algorithm/linked/MergeTwoOrderedLinked.java)
* [删除链表倒数第n个结点(19)](/src/main/java/com/yzd/algorithm/linked/DeleteNodeN.java)
* [求链表的中间结点(876)](/src/main/java/com/yzd/algorithm/linked/MiddleNode.java)
[栈](/src/main/java/com/yzd/algorithm/stack)
* [有效的括号(20)](/src/main/java/com/yzd/algorithm/stack/ValidParentheses.java)
* [最小栈(155)](/src/main/java/com/yzd/algorithm/stack/MinStack.java)
* [用栈实现队列(232)](/src/main/java/com/yzd/algorithm/stack/ImplementQueueUsingStacks.java)
* [用队列实现栈](/src/main/java/com/yzd/algorithm/stack/ImplementStacksUsingQueue.java)
* [比较含退格的字符串(844)](/src/main/java/com/yzd/algorithm/stack/BackspaceStringCompare.java)
* [基本计算器(224)](/src/main/java/com/yzd/algorithm/stack/BasicCalculator.java)
* [棒球比赛(682)](/src/main/java/com/yzd/algorithm/stack/BaseballGame.java)
* [下一个更大元素I(496)](/src/main/java/com/yzd/algorithm/stack/NextGreaterElementI.java)
[排序](/src/main/java/com/yzd/algorithm/sort)
| | 时间复杂度 | 是否稳定排序 | 是否原地排序 |
| :--------- | ---------- | :----------- | :----------- |
| 冒泡怕排序 | O(n^2) | 是 | 是 |
| 插入排序 | O(n^2) | 是 | 是 |
| 选择排序 | O(n^2) | 否 | 是 |
| 快速排序 | O(n*logn) | 否 | 是 |
| 归并排序 | O(n*logn) | 是 | 否 |
| 计数排序 | O(n+k) k是数据范围 | 是 | 否 |
| 桶排序 | O(n) | 是 | 否 |
| 基数排序 | O(dn) d是维度 | 是 | 否 |
* [冒泡排序](/src/main/java/com/yzd/algorithm/sort/BubbleSort.java)
* [插入排序](/src/main/java/com/yzd/algorithm/sort/InsertionSort.java)
- 冒泡排序和插入排序的时间复杂度都是O(n2),都是原地排序算法,都是稳定的排序算法。
- 冒泡排序插和入排序不管怎么优化,元素交换的次数是一个固定值,是原始数据的逆序度。
- 为什么插入排序要比冒泡排序更受欢迎呢?
- 代码实现上来看,冒泡排序的数据交换要比插入排序的数据移动要复杂,冒泡排序需要 3 个赋值操作,而插入排序只需要 1 个
```java
//冒泡排序中数据的交换操作:
if (a[j] > a[j+1]) { // 交换
int tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
flag = true;
}
//插入排序中数据的移动操作:
if (a[j] > value) {
a[j+1] = a[j]; // 数据移动
} else {
break;
}
```
* [归并排序](/src/main/java/com/yzd/algorithm/sort/MergeSort.java)
- 并归排序是稳定的排序算法不是原地排序,时间复杂度是O(nlogn) 空间复杂度是 O(n)
* [快速排序](/src/main/java/com/yzd/algorithm/sort/QuickSort.java)
- 快排是一种原地、不稳定的排序算法,间复杂度也是 O(nlogn)
* [计数排序](/src/main/java/com/yzd/algorithm/sort/CountingSort.java)
* [二分查找](/src/main/java/com/yzd/algorithm/find/Bsearch.java)
- 时间复杂度O(logn)
散列表
散列表的装载因子=填入表中的元素个数/散列表的长度
[二叉树](/src/main/java/com/yzd/algorithm/tree)
* 二叉树既可以用链式存储,也可以用数组顺序存储。
数组顺序存储的方式比较适合完全二叉树,其他类型的二叉树用数组存储会比较浪费存储空间。
除此之外,二叉树里非常重要的操作就是前、中、后序遍历操作,遍历的时间复杂度是 O(n)
* 二叉树的遍历
1. 前序遍历是指,对于树中的任意节点来说,先打印这个节点,然后再打印它的左子树,最后打印它的右子树。
2. 中序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它本身,最后打印它的右子树。
3. 后序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它的右子树,最后打印这个节点本身。
* 实际上,二叉树的前、中、后序遍历就是一个递归的过程
` 写递归代码的关键,就是看能不能写出递推公式,而写递推公式的关键就是,如果要解决问题 A,
就假设子问题 B、C 已经解决,然后再来看如何利用 B、C 来解决 A。
所以,我们可以把前、中、后序遍历的递推公式都写出来。`
```
前序遍历的递推公式:preOrder(r) = print r->preOrder(r->left)->preOrder(r->right)
中序遍历的递推公式:inOrder(r) = inOrder(r->left)->print r->inOrder(r->right)
后序遍历的递推公式:postOrder(r) = postOrder(r->left)->postOrder(r->right)->print r
```
```
void preOrder(Node* root) {
if (root == null) return;
print root // 此处为伪代码,表示打印root节点
preOrder(root->left);
preOrder(root->right);
}
void inOrder(Node* root) {
if (root == null) return;
inOrder(root->left);
print root // 此处为伪代码,表示打印root节点
inOrder(root->right);
}
void postOrder(Node* root) {
if (root == null) return;
postOrder(root->left);
postOrder(root->right);
print root // 此处为伪代码,表示打印root节点
}
```
散列表:插入删除查找都是O(1), 是最常用的,但其缺点是不能顺序遍历以及扩容缩容的性能损耗。适用于那些不需要顺序遍历,数据更新不那么频繁的。
跳表:插入删除查找都是O(logn), 并且能顺序遍历。缺点是空间复杂度O(n)。适用于不那么在意内存空间的,其顺序遍历和区间查找非常方便。
红黑树:插入删除查找都是O(logn), 中序遍历即是顺序遍历,稳定。缺点是难以实现,去查找不方便。其实跳表更佳,但红黑树已经用于很多地方了。
2018-12-02
堆排序是一种原地的、时间复杂度为 O(nlogn) 的排序算法
原地排序(Sorted in place)。原地排序算法,就是特指空间复杂度是 O(1) 的排序算法
稳定性。这个概念是说,如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变。
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
资源推荐
资源详情
资源评论
收起资源包目录
算法数据结构学习.zip (30个子文件)
open_suanfayushujujiegouxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcxxxxxxxxxxxxcxvcvcv
pom.xml 791B
src
main
java
test
dd
Node.java 456B
Tree.java 886B
com
yzd
algorithm
sort
CountingSort.java 2KB
QuickSort.java 1KB
ArrayUtil.java 674B
InsertionSort.java 1KB
BubbleSort.java 960B
MergeSort.java 2KB
point
Point.java 1KB
GPSUtil.java 10KB
stack
ImplementQueueUsingStacks.java 3KB
BasicCalculator.java 3KB
ImplementStacksUsingQueue.java 4KB
BaseballGame.java 3KB
ValidParentheses.java 2KB
MinStack.java 2KB
NextGreaterElementI.java 6KB
BackspaceStringCompare.java 2KB
linked
Node.java 419B
ReverseLinked.java 3KB
MergeTwoOrderedLinked.java 2KB
DetectionOfRing.java 2KB
DeleteNodeN.java 1KB
GenerateLinkedUtil.java 2KB
MiddleNode.java 1KB
find
Bsearch.java 1KB
复杂度分析.md 1KB
.gitignore 493B
README.md 7KB
共 30 条
- 1
资源评论
极致人生-010
- 粉丝: 2967
- 资源: 2825
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 论文(最终)_20240430235101.pdf
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
- 林周瑜-论文.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功