数据结构—绪论

来源:互联网 发布:北大燕京学堂知乎 编辑:程序博客网 时间:2024/05/18 13:48

我们使用的教材是李春葆教授的《数据结构教材》,目前正在学习,感觉这本书非常不错。


N.Wirth 的著名公式:程序 = 算法 + 数据结构

算法:是对特定问题求解步骤的一种描述,它是指令的有限序列。(输入 —> 输出)

算法5个特性:有穷性、确定性、可行性、有输入、有输出。

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。(数据 + 结构)

1.逻辑结构:集合结构(无关系)、线性结构(一对一)、树形结构(一对多)、图形结构(多对多)。

2.存储结构(物理结构):顺序存储结构、链式存储结构、索引存储结构、哈希(散列)存储结构


相关知识:

1.数据类型

(1)定义结构体的方法:struct  结构体名称 { 域定义 };

(2)定义新类型名的方法:typedef 数据类型 类型名;

typedef struct Student //声明结构体类型struct Student{char name[20];//name , sex , age 为结构体成员char sex;int age;}st;//用st别名表示Student结构体//定义:st student1; ( 等同于struct Student student1;)  赋值:student1.name = "Li Lin"; student1.sex = 'M'; student1.age = 18;typedef int ElemType; // 为了程序的更改与维护,给int取别名


2.存储空间分配

(1)静态存储空间分配指变量在定义时就分配存储单元并一直保持不变,直到整个程序结束。int a[10];//一遇到该语句,系统就为a数组分配10个int大小的整数空间

(2)动态存储空间分配:指在程序运行期间根据需要动态地分配存储空间的方式。

对内存的动态分配是通过系统提供的库函数来实现的,主要有malloc( ),calloc( ),free( ), realloc( )这4个函数。

通常使用 malloc( ) 函数为一个指针变量分配一片连续空间,当不需要时使用 free( ) 函数释放指针变量所指向的空间。

//函数原型 void * malloc(unsigned int size);//返回值为指针所指向分配区域的首地址//函数原型 void * free(void * p);           //释放指针变量所指向的已分配的动态空间int *p;   p = (int *)malloc(10 *sizeof(int));    free(p);



3.抽象数据类型

ADT 抽象数据类型名

{

数据对象:数据对象的声明

数据关系:数据关系的声明

基本运算:基本运算的声明

}

基本运算的声明格式:基本运算名(参数表):运算功能描述

两种参数:值参数(只为运算提供输入值,不改变实参的值)与址参数(除提供运算的输入值外还改变实参)

//传值型,不改变实参void swap(int x, int y)//调用swap(a, b)后会发现形参x与y的值发生交换,但是实参a与b的值没有发生交换{int t;t = x; x = y; y = t;}//传址型,改变实参void swap(int *x, int *y)//采用指针的方式来回传形参的值,调用方式为swap(&a, &b){int t;t = *x; *x = *y; *y = t;}void swap(int &x, int &y)//采用引用型形参,实现形参与实参同步改变,调用方式为swap(a, b){int t;t = x; x = y; y = t;}//扩展:两个变量交换的三中方法t = a; a = b; b = t;//三变量法(常用)a = a + b; b = a - b; a = a - b;//和差法a = a ^ b; b = a ^ b; a = a ^ b;//异或法

4.算法分析

(1)时间复杂度:评估执行程序所用的时间(CPU时间)

(2)空间复杂度:评估执行程序所需的存储空间(内存空间)

  注时间复杂度往往比空间复杂度更容易出问题,一般我们只讨论时间复杂度

   大O表示法:T(n)=O(f(n))   f(n)为问题规模n的某个函数(程序运行次数函数)n为问题规模

           推导大O阶方法:

1.用常数1取代运行时间中的所有加法常数。

2.在修改后的运行时间次数中,只保留最高阶项。

3.如果最高阶项的系数存在,则去除这个系数。

  如:f(n)= 5n^3+2n+1   则为T(n) = O(n^3)

     一些时间复杂度的关系:

  O(1) < O(log2n) < O(n)< O(nlog2n) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)



















原创粉丝点击