dsa-基础

article/2025/10/24 16:06:42

算法与数据结构

  • 0.概念
    • 数据结构
    • 复杂度
      • 时间复杂度
      • 空间复杂度
  • 1. 线性表
    • 顺序表(数组)
    • 链表
      • 单链表
      • 双链表
      • 循环链表
      • 静态链表
    • 顺序表/链表
      • 顺序栈
      • 链式栈
    • 队列
      • 顺序循环队列
      • 链表队列
      • 双端队列
  • 2. 递归
    • 递归与栈
      • 阶乘例子
  • 3. 矩阵
    • 对称矩阵
    • 三角矩阵
    • 稀疏矩阵
  • 4. 字符串

0.概念

数据结构

逻辑结构

  • 集合
  • 线性

物理结构 (存储结构)

  • 线性存储 : 元素存储必须是连续的
  • 链式存储 :指针地址
  • 索引存储 :索引表(关键字 地址)
  • 散列存储 (哈希存储):(关键字 直接计算出内存地址)

复杂度

时间复杂度

事前预估 时间开销 T ( n ) T(n) T(n)问题规模n的关系
执行次数 x x x x = f ( n ) x=f(n) x=f(n),复杂度与 f ( n ) f(n) f(n)的数量级 T ( n ) T(n) T(n)
1 < l o g n < n < n l o g n < n 2 < n 3 < 2 n 1<logn<n<nlogn<n^2<n^3<2^n 1<logn<n<nlogn<n2<n3<2n

估算策略

  • 忽略顺序执行语句
  • 只关注循环部分,且关注其中的一个循序语句
  • 只关注嵌套循环中最深层中的执行语句

空间复杂度

与内存空间(通常与字节为单位)

估算策略

找到所占空间与问题规模相关的变量

1. 线性表

数据元素的数据类型相同
有序
数量有限

索引:–> 位序
第一个元素:表头
前一个元素:直接前驱
后一个元素:直接后继

顺序表(数组)

顺序(连续)存储

  • 随机访问(随机存取)

O(1)

  • 插入、删除

O(n)

  • 查找

按位查找: O(1) ,因为是随机存取的
按值查找: O(n)

链表

链式存储

单链表

  • 带头结点

  • 不带头结点 -建议使用

  • 插入、删除 (按位序) ???

O(n) 相当于查找耗时

  • 查找

O(n)

  • 尾插法

普通尾插法 O ( n 2 ) O(n^{2}) O(n2) – 见例子 ‘dsa-cpp

双链表

在单链表的基础上,加上一个指向prior的前向指针

循环链表

在单链表的基础上,最后的一个尾结点指向了头结点
给定一个节点,可以找到链表中的任意其他节点(单链表只能找到该节点的后继节点)

静态链表

单链表在内存中是随机存储的
静态链表在内存中是连续存储(注意:不是顺序存储)的
头结点的地址+游标*字节大小
在这里插入图片描述

顺序表/链表

  • 顺序表

顺序存储、随机存取
连续内存分配不方便,插入删除不方便

  • 链表

链式存储,不能顺序存取
离散空间分配方便,插入删除方便

只允许在一端进行插入或删除操作的线性表
后进先出(LIFO)

顺序栈

增删改查 O(1)

链式栈

一般使用头插法

队列

只允许在一端进行插入,在另一端删除的线性表
先进先出(FIFO)

这里讨论的循环队列

顺序循环队列

利用数组实现

第一种实现方法 – 见例子
在某些情况下会浪费一个存储空间
在这里插入图片描述

链表队列

利用链表实现

双端队列

运算两端插入、两端删除

2. 递归

C语言教程文档
实际上是 函数调用栈
函数调用

调用返回地址
实参
局部变量

void main()
{int a,b,c;func1(a,b);c=a+b;
}void func1(int a,int b)
{int x;func2(x);
}void func2(int x)
{int m,n;
}

func1()的地址,func1() 函数中的局部变量a,b
main() 函数中的局部变量 a,b
main()

在这里插入图片描述


在这里插入图片描述

递归与栈

阶乘例子

#include <iostream>
using namespace std;int factorial(int n)
{if (n==0 || n==1){return 1;}else{return n*factorial(n-1);}
}int main()
{int x=factorial(10);cout<<x<<endl;return 0;
}

在这里插入图片描述


在这里插入图片描述

3. 矩阵

对称矩阵

行优先存储下
一维数组下标与对称矩阵数据下标的映射函数
eg1:假设一维数组是从0开始;二维数组(不是下图所示)也是从0开始的:
a [ i ] [ j ] − − > a [ i ∗ i + 1 2 + j ] a[i][j] --> a[i* \frac{i+1}{2}+j] a[i][j]>a[i2i+1+j]
1 + 2 + . . . + ( i ) + ( j + 1 ) − 1 = i ∗ i + 1 2 + j 1+2+...+(i)+(j+1)-1 = i* \frac{i+1}{2}+j 1+2+...+(i)+(j+1)1=i2i+1+j

eg2:假设一维数组是从0开始;二维数组(如下图所示)也是从1开始的:
a [ i ] [ j ] − − > a [ ( i − 1 ) ∗ i 2 + j − 1 ] a[i][j] --> a[(i-1)* \frac{i}{2}+j-1] a[i][j]>a[(i1)2i+j1]
1 + 2 + . . . + ( i − 1 ) + j − 1 = ( i − 1 ) ∗ i 2 + j − 1 1+2+...+(i-1)+j-1 = (i-1)* \frac{i}{2}+j-1 1+2+...+(i1)+j1=(i1)2i+j1

在这里插入图片描述

三角矩阵

  • 上三角
  • 下三角

见王道视频

稀疏矩阵

  • 方法1

顺序存储: 三元组<行,列,值>
结构体数组
在这里插入图片描述

  • 方法2

链式存储:十字链表法

在这里插入图片描述

4. 字符串

索引从0开始
位序/位置从1开始

字符串是一种特殊的线性表

数组形式

  • 静态存储

char ch[]

  • 动态存储

char *ch=(char *)malloc(length*sizeof(char))

在这里插入图片描述

链表形式

链表形式存储


http://chatgpt.dhexx.cn/article/DvrFpun7.shtml

相关文章

dsadas

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

DSDA 简介

参考link&#xff1a;千呼万唤&#xff0c;5G双卡双通到底有多重要&#xff1f;__财经头条 (sina.com.cn)

Java 排序算法:折半插入排序

有关排序的基本内容可以查看以下链接&#xff1a; 折半插入排序_360百科折半插入排序,折半插入排序(Binary Insertion Sort)是对插入排序算法的一种改进。所谓插入排序&#xff0c;就是不断的依次将元素插入前面已排好序的序列中。https://baike.so.com/doc/7028767-7251672.h…

Java排序算法——猴子排序(Bogo Sort)

此排序和之前介绍的三种排序没有任何关系&#xff0c;只是单纯在整理排序算法突然想到曾经看到过关于此排序的描述&#xff0c;现在总结一下。 之前三种排序的传送门开一下&#xff1a; 冒泡排序&#xff1a; Java排序算法——冒泡排序&#xff08;Bubble Sort&#xff09;ht…

java排序算法精讲

排序算法 概要一、冒泡排序概念实现步骤 代码 二、选择排序概念实现步骤 代码 三、插入排序概念实现步骤 代码 四、快速排序概念实现步骤 代码 五、归并排序概念实现步骤 代码 六、堆排序概念实现步骤 代码 总结以二维表表现出各个排序的关系 概要 Java是一种面向对象的编程语言…

Java排序算法(一):冒泡排序

冒泡排序 一、原理二、排序步骤三、实现代码四、复杂度分析 一、原理 冒泡排序是相邻的元素两两比较&#xff0c;把小的元素往前调或者把大的元素往后调&#xff0c;实现最大(小)值排列在一端。 注&#xff1a;相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法 …

十大经典排序算法(Java实现)

排序算法的重要性不言而喻&#xff0c;为了加深对这十种算法的理解&#xff0c;固写此文。 目录 1、冒泡排序&#xff08;Bubble Sort&#xff09;2、选择排序&#xff08;Selection Sort&#xff09;3、插入排序&#xff08;Insertion Sort&#xff09;4、希尔排序&#xff0…

Java排序算法——插入排序(Insertion Sort)

之前总结了交换排序的冒泡排序与选择排序的简单选择排序&#xff0c;这次我们来看看插入排序的简单插入排序~ 往期传送门&#xff1a; 冒泡排序&#xff1a; Java排序算法——冒泡排序&#xff08;Bubble Sort&#xff09;https://blog.csdn.net/babbfqb93/article/details/…

Java排序算法——冒泡排序(Bubble Sort)

冒泡排序是所有排序算法中最简单的一个排序&#xff0c;也是我个人学习的第一个排序方法&#xff0c;在这里重新进行一个总结。 冒泡排序&#xff08;Bubble Sort&#xff09;就如同其名称一样&#xff0c;水中的气泡由于压强的原因所以从下到上其大小也是从小到大&#xff0c…

Java排序算法——插入排序

Java排序算法——插入排序&#xff08;Insertion Sort&#xff09; 传送门 冒泡排序选择排序 简述 插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法。它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前…

Java实现排序算法

一、常见排序算法&#xff1a; 1、插入类排序&#xff1a; (1)直接插入排序 (2)希尔排序 2、选择类排序 (1)简单选择排序 (2)堆排序 3、交换类排序 (1)冒泡排序 (2)快速排序 4、归并排序 5、基数排序 二、内部排序&#xff1a;只考虑数据量较小仅需要使用内存的排序算法 三、…

Java排序算法——选择排序

Java排序算法——选择排序&#xff08;Selection sort&#xff09; 传送门 冒泡排序插入排序 简述 选择排序&#xff08;Selection sort&#xff09;是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小&#xff08;大&#xff09;元素&#xff0c;存放…

JAVA排序:快速排序算法

Java实现快速排序算法 快速排序算法体现了—分治思想&#xff1a;将大问题划分为多个相同独立的小问题&#xff0c;每个小问题的解决合在一起解决了大问题 实现快速排序的思想&#xff1a; {2,4,1,0,3,5}是目标数组 {0,1,2,3,4,5}是结果数组 选取中心轴pivot(中心轴的值用于比较…

Java排序算法——选择排序(Selection Sort)

上次总结了一下冒泡排序&#xff0c;这次来看看同样非常简单的选择排序 上期冒泡排序传送门&#xff1a; Java排序算法——冒泡排序&#xff08;Bubble Sort&#xff09;https://blog.csdn.net/babbfqb93/article/details/123005968?spm1001.2014.3001.5501 选择排序&#…

选择排序——Java排序算法

选择排序 选择排序&#xff08;SelectSort&#xff09;选择排序是所有排序中最简单的排序算法之一&#xff0c;同时也是要求我们必须掌握的排序算法之一。 时间复杂度 选择排序的时间复杂度为(n2) 算法步骤 1.在未排序的序列中找到最小或者最大的元素&#xff0c;存放到排…

java 排序api_JAVA排序算法API

上一个类 下一个类 框架 无框架 摘要&#xff1a; 嵌套 | 字段 | 构造函数 | 方法 详细信息&#xff1a; 字段 | 构造函数 | 方法 org.luosijin.test 类 Sort java.lang.Object org.luosijin.test.Sort public class Sort extends java.lang.Object Java实现几种常见排序方…

Java排序算法

7.1 排序算法的介绍 排序也称排序算法(Sort Algorithm)&#xff0c;排序是将一组数据&#xff0c;依指定的顺序进行排列的过程。 7.2 排序的分类 内部排序: 指将需要处理的所有数据都加载到内部存储器(内存)中进行排序。外部排序法&#xff1a; 数据量过大&#xff0c;无法全…

常见几种java排序算法

常见几种java排序算法 0. 总览时间复杂度和稳定性 1.插入排序2.分治排序法,快速排序法3.冒泡排序 low版4.冒泡排序 bigger版5.选择排序6. 归并排序8. 堆排序踩坑v1.0 巨慢不能用v2.0 太慢不能用v3.0 9. 其他排序7. 比较 0. 总览 时间复杂度和稳定性 平均最好最差稳定性冒泡n2…

Java常用实现八种排序算法与代码实现

一、交换排序 所谓交换&#xff0c;就是序列中任意两个元素进行比较&#xff0c;根据比较结果来交换各自在序列中的位置&#xff0c;以此达到排序的目的。 1. 冒泡排序 冒泡排序是一种简单的交换排序算法&#xff0c;以升序排序为例&#xff0c;其核心思想是&#xff1a; 从…

十大经典排序算法——java语言

文章目录 一、冒泡排序二、选择排序三、插入排序四、希尔排序五、归并排序六、快速排序七、堆排序八、计数排序九、桶排序十、基数排序 一、冒泡排序 概述&#xff1a; 冒泡排序是一种简单直观的排序算法。它重复的走访要排序的数列&#xff0c;一次比较两个元素&#xff0c;按…