基础 数据结构
公式:某些无法用markdown表达的公式,比如【底数】就用word 生成,转成图片。
cnblog markdown引擎 不支持平方公式 2^2 = 4,因为都能看懂,就没有转换 成图片
结构体 struct
c struct 声明 定义
#include<stdio.h> int main(void){ //define struct method 1 struct Node{ int a; int b; char str; }; struct Node myNode; myNode.a = 100; myNode.b = 200; myNode.str = 'A'; printf("method1 a=%d,b=%d,str=%d \n ", myNode.a , myNode.b,myNode.str); //define struct method 2 struct Node2{ int a; int b; char str; }myNode2={101,201,'B'}, myNode3={102,202,'C'}; printf("method2 myNode2 a=%d,b=%d,str=%d \n ", myNode2.a , myNode2.b,myNode2.str); printf("method2 myNode3 a=%d,b=%d,str=%d \n ", myNode3.a , myNode3.b,myNode3.str); //define strcut method3 typedef struct { int a; int b; char str; }Node3; Node3 myNode4 = {104,205,'D'}; printf("method3 a=%d,b=%d,str=%d \n ", myNode4.a , myNode4.b, myNode4.str); }
c与cpp struct声明 定义 区别:http://www.cnblogs.com/scotth/p/3843272.html
时间复杂度(平均,最坏情况)、
空间复杂度、
稳定性、
都是我们选择排序算法需要考虑的
-
(二叉)堆是一个数组,它可以看成一个近似的 完全二叉树。
-
堆排序,归并排序 都是渐优的比较排序算法, 时间复杂度是 O(n logn).
-
桶排序,时间复杂度最低, 但是对于数值大的数m, 浪费的空间太多。时间复杂度:O(n),空间复杂度:O(m), 原理:将值为i的元素放入i号桶,最后依次倒出。
-
实际情况中 快排 效率最高,因为它的平均性能比较好。平均期望时间复杂度是 O(n lgn),最坏时间复杂度是 O( n^2 ),而且O(n lgn)中隐含的常数因子非常小。
ADT 抽象数据类型(abstract data type)
-
表
- 如果用数组方式实现,内存连续,插入、删除最坏时间复杂度是O(n)
- 如果在位置0,插入一个元素,则后面所有的元素都需要后移一个位置
- 如果在位置0,删除一个元素,则后面所有的元素都需要前移一个位置
- 如果用数组方式实现,内存连续,插入、删除最坏时间复杂度是O(n)
-
链表
- 内存不连续
- 插入、删除 时间复杂度是O(1)
关于链表 插入,删除, 创建,是否为空,
#ifndef _List_H_ struct Node; typedef struct Node *Ptr2Node;//定义一个Node 结构体类型的 指针 typedef Ptr2Node List; //创建一个静态Node对象 typedef Ptr2Node Positon; // List MakeEmpty(List L); int IsEmpty(List L); int IsLast(Position P, List L); Position Find(ElementType X, List L); void Delete(ElementType X, List L); Position FindPrevious(ElementType X, List L); void Insert(ElementType X, List L, Position P); void DeleteList(List L); Position Header(List L); Position First(List L); Position Advance(Position P); ElementType Retrieve(Position P); #endif /*_List_H*/ /*Place in the implementation file*/ struct Node{ ElementType Element; Position Next; }
//链表代码的 具体实现,《数据结构与算法分析----c语言描述》2nd Mark Allen Weiss著 p35 //这里不多说
-
循环链表(首尾相接)
-
双向链表
一些问题的思考:
- 链表倒序
- 单向链表:【表尾】改成【表头】,next,依次改变, 1234->4321
- 双向链表:略
不管什么链表,画个图,就很清晰。
栈
只需要记得 LIFO, FILO,
//栈代码 具体实现,《数据结构与算法分析----c语言描述》2nd Mark Allen Weiss著 p47
队列
常应用于排队的场合。
双向队列
hash
树
- 二叉搜索树(binary search tree)
二叉搜索树的基本操作 花费的时间 与这棵树的高度成正比。
对于有n个节点的一棵完全二叉树来说,最坏运行时间为O(lg n)。然而,如果这棵树是一条n个节点组成的线性链,那么同样的操作 就要花费O(n)的最坏运行时间。
- 查询二叉搜索树 O(*h*)时间内,执行`MINIMUM` `MAXIMUM` `SUCCESSOR` `PREDECESSOR` 查询操作。
typedef struct TreeNode *Ptr2Node; typedef struct Ptr2Node Tree; struct TreeNode{ ElementType Element; Tree Left; Tree Right; } //树代码 具体实现,《数据结构与算法分析----c语言描述》2nd Mark Allen Weiss著 p75
- AVL (Adelson-Velskii 和Landis )树是带有平衡条件的二叉查找树
必须保持平衡,保证树的深度 为O(log N), 最简单的想法是 左右子树 有相同的高度。
- 树的遍历
前序
中序
后序
void PrintTree(SearchTree T){ //按顺序打印二叉查找树 的case if(T!= NULL){ PrintTree(T->Left); PrintElement(T->Element); PrintTree(T->Right); } }
- B-树 : SBL 平衡 搜索树
适用于 二级(磁盘) 存储器上的数据库维护
Average WorstCase Space O(n) O(n) Search O(log n) O(log n) Insert O(log n) O(log n) Delete O(log n) O(log n)
阶为M的B-树 具有下列结构特性:
- 树的根 或者是一片树叶,或者其儿子 数 在2和M之间
- 除根外,所有的非树叶节点的儿子数 在[M/2]和M之间
- 所有的树叶 都在相同的深度上
-
红黑树 (red-black tree)
是许多平衡树的一种,可以保证在最坏情况下 基本动态集合 操作的时间复杂度是O(lg n);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)