基础 数据结构

公式:某些无法用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


排序算法 us wiki
排序算法 中文wiki

时间复杂度(平均,最坏情况)、
空间复杂度、
稳定性、
都是我们选择排序算法需要考虑的

  • (二叉)堆是一个数组,它可以看成一个近似的 完全二叉树。
  • 堆排序,归并排序 都是渐优的比较排序算法, 时间复杂度是 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(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

MySQL索引背后的数据结构及算法原理 mooc地址

  • 二叉搜索树(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之间
- 所有的树叶 都在相同的深度上

  • B+树

  • 红黑树 (red-black tree)
    是许多平衡树的一种,可以保证在最坏情况下 基本动态集合 操作的时间复杂度是O(lg n);

posted @   scott_h  阅读(201)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 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)
点击右上角即可分享
微信分享提示