目录

Note

本页偏基础知识与目录,主题关系图见 算法知识地图

数据结构

算法

数据元素

数据元素是数据的基本单位,数据元素可由几个数据项构成,数据项是数据不可分割的最小单位

数据对象是数据元素的集合

例:

中国富豪榜人物财富
马云100y
马化腾300y

其中一行就是数据元素,具体马云、财富等就是数据项,整个表是数据元素

逻辑结构


集合结构:之中数据同属一个集合,之间没有另类的结构
线性结构:一对一的关系
树形结构:一对多的层次关系(金字塔关系)
图形结构:多对多关系(交际关系网络)

物理结构


  • 如何把数据存储到计算机的存储器中(针对内存而言)
  • 硬盘等外部存储器数据采用文件结构描述

数据存储结构形式有两种

顺序存储

  • 数据存储在地址连续的存储单元,逻辑关系和物理关系一致 例:000123-000124-000125…

链式存储

  • 数据存储在任意存储单元,完全随机 例:指针

数据结构与算法


例:1+2+3…+100

int i,sum = 0,n = 100;
for(i = 1;i <= n;i++)
{
    sum=sum+i;
} 
printf("%d",sum);

or:

int i,sum = 0,n = 100;
sum=(1+n)*n/2;\\等差数列求和
printf("%d",sum);

算法具有五个特征:输入,输出,有穷性1,确定性2,可行性3
算法设计要求:

  • 正确性
  1. 没有语法错误
  2. 合法输入满足要求输出
  3. 非法输入满足规格说明
  4. 对故意刁难的测试输入有满足要求的输出结果
  • 可读性

便于他人阅读

  • 健壮性

不合法不会崩溃

  • 时间效率存储效率

时间复杂度,空间复杂度


T(n)增长最慢的算法为最优算法
大O记法:

  • 基本语句、加法常数记为 1
  • 最高阶存在且不为 1 除于此项相乘的常数
    例1:
int n=100,sum=0;
printf("666\n");
printf("666\n");
printf("666\n");
printf("666\n");
printf("666\n");
printf("666\n");
sum = (1/n)*n/2;  

程序只按顺序只跑一次因此时复为O(1)
例2:

int i, n = 100, sum = 0;
for(i=0;i<n;i++){
sum=sum+i;
}

以上程序时间复杂度为O(n)

例3:

for(;;)
    for(;;)
        body;

O(n^2)

例4:

while(i<n)
{
    i=i*2;
}

时间复杂度 O(logn) 实际

例子时间复杂度空间复杂度
cO(1)常数阶
an+bO(n)线性阶
an^2+bn+cO(n^2)平方阶
alog_{b}nO(logn)对数阶
alog_{b}n+cn+dO(nlogn)nlogn阶
2^nO(2^n)指数阶

通常耗费时间:
O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

算法存在最坏情况和平均情况

空间复杂度


即需要的硬盘、内存空间

抽象数据类型


C语言中抽象数据类型有两种
原子型:不可分割,如整型、浮点型、字符型
结构类型:若干类型组合而成,如各类型数组、结构体
抽象数据类型:ADT—数学抽象特性,如游戏中人物位置由x,y,z即抽象数据类型
描述抽象数据类型标准格式

Note

ADT 抽象数据类型名
Data

数据元素之间逻辑关系的定义

Operation

操作

endADT

Footnotes

  1. 有限数据处理

  2. 唯一数据意义不会产生二义性

  3. 每一步都通过有线次数完成,且环境允许运行