潍坊市论坛

注册

 

发新话题 回复该主题

LinuxC开发第八天数据结构和算 [复制链接]

1#

本文主要内容:数据结构类型,算法,时间复杂度,空间复杂度,内存分段。

程序=数据结构+算法

数据结构类型

1.逻辑类型

(1)线性结构(1:1):

顺序表

链表

栈(FILO)

队列(FIFO)

(2)非线性结构:

层次结构(1:N)---树状结构

网状结构(N:N)---图

2.存储类型

存储设备内部数据之间的关系

(1)顺序存储

如数组,堆区(malloc)结构体内部字符串

方便查找不方便增删。

(2)链式存储

方便增删不方便查找。

(3)索引存储

如字典,顺序+链式。

(4)散列存储

哈希(hash)算法.

3.运算

增,删,改,查,排列

算法

1.时间复杂度

评估执行程序所需的时间。可以估算出程序对处理器的使用程度。

规则:

多项式:保留最高次幂项,砍去系数。

常数:1。

inta=1;a=a+1;//执行次数是2次.//这个算法的时间复杂度为O(1).for(inti=0;in;i++){//时间复杂度为O(1)的算法...}//上面算法循环体中的代码执行了n次,因此时间复杂度为O(n).//执行次数是线性的.for(intnumber=1;numbern;number*=2){//时间复杂度为O(1)的算法...}//随着number每次乘以2后,都会越来越接近n,//当number不小于n时就会退出循环。假设循环的次数为X,//则由2^x=n得出x=log?n,因此得出这个算法的时间复杂度为O(logn)。//执行次数是对数的.for(inti=0;in;i++){for(intj=0;jn;i++){//复杂度为O(1)的算法...}}//内层循环的时间复杂度已经得知是O(n),现在经过外层循环n次,//那么这段算法的时间复杂度则为O(n2)。//执行次数是一个多项式.for(inti=0;in;i++){for(intj=0;ji;j++){//复杂度为O(1)的算法}}//内循环中intj=0,ji。//当i=0时,内循环执行了0次;i=1时内循环执行1次,//当i=n-1时执行了n-1次,我们可以推算出总的执行次数为://n+(n-1)+(n-2)+(n-3)+……+1//=(n+1)+[(n-1)+2]+[(n-2)+3]+[(n-3)+4]+……//=(n+1)+(n+1)+(n+1)+(n+1)+……//=(n+1)n/2//=n(n+1)/2//=n2/2+n/2//只保留最高阶,因此保留n2/2再砍去系数//那么这段算法的时间复杂度则为O(n2)。

常见:

冒泡:n^2

快排:平均nlog2^n;最大n^2

2.空间复杂度

评估执行程序所需的存储空间。可以估算出程序对计算机内存的使用程度。即最大一次使用的空间的大小。

内存分段

4G----高地址----

---内核空间

---

3G----应用层(用户空间)----

---主程序传参环境(argv[])

---

---栈区(函数局部变量)

---

---垃圾空间

---

---堆区(malloc申请)

---

---静态区

数据区/p>

.bss:未初始化的数据

.data:初始化的数据(全局变量,static)

.rodata:只读数据段:字符串常量

---只读区

text代码段

.init0----低地址----NULL、(void*)0()不可读不可写,只用来比较和赋初始值

堆区:M

malloc申请,free释放

不释放容易导致内存泄漏!

函数传参:

全局变量:

以全局变量为耻,以局部变量为荣。

不好维护,空间不影响大量申请。

局部变量:

无static修饰的,存在栈区,函数退出,空间释放。

主函数的局部变量:

不能大量申请,容易导致栈溢出。

预览时标签不可点收录于话题#个上一篇下一篇
分享 转发
TOP
发新话题 回复该主题