数据结构包括三方面的内容,即数据的逻辑结构、数据的存储结构和对数据所施加的运算。
1.1 基本术语:
数据、数据元素、数据对象、数据结构、数据类型、抽象数据类型
1.2 数据结构的内容
1.逻辑结构
根据数据元素之间关系的不同特性,通常有下列四种基本结构
(1)集合关系:该结构中的数据元素之间除了同属于一个集合的关系外,无任何其他关系。
(2)线性结构:该结构中的数据元素之间存在着一对一的线性关系。
(3)树形结构:该结构中的数据元素之间存在着一对多的层次关系。
(4)图状结构或网状结构:该结构中的数据元素之间存在着多对多的任意关系。
数据的四种基本逻辑结构可概括为:
线性结构:线性表,栈,队,字符串,队,字符串,数组,广义表
非线性结构:树,图
2.存储结构
数据结构从存储结构上划分为两种:顺序存储、链式存储
索引存储,散列存储
3.运算集合:增、删、查、改
4.数据结构三方面的关系:
线性表是一种逻辑结构,若采用顺序存储方法,可称其为顺序表;若采用链式存储方法,则可称其为链表;若采用散列存储方法,则可称其为散列表。
若对线性表上的插入、删除运算限制在表的一端进行,则该线性表称之为栈;若将插入运算限制在表的一端进行,而删除运算限制在表的另一端进行,则该线性表称之为队列。
1.3 算法描述:
程序=算法+数据结构
1.3.1基本概念
1.算法的定义算法(algorithm)是规则的有限集合,是为了解决特定问题而规定的一系列操作。
2.算法的特性:有限性、确定性、输入、输出、可行性
3.算法设计的要求:正确性、可读性、健壮性、高效率和低存储量
1.3.2算法描述的工具
流程图、自然语言、其它、计算机语言
1.4 算法分析
1.4.1 时间复杂度
1.语句频度
语句频度是指该语句在一个算法中重复执行的次数,一个算法的时间耗费是该算法中所有语句频度之和。
2.时间复杂度
时间复杂度为
T(n)=O(f(n))
数据结构中常用的时间复杂度频率计数有以下7种。
(1)O(1),表示常数型。
(2)O(n),表示线性型。
(3)O(n2),表示平方型。
(4)O(n3),表示立方型。
(5)O(2n),表示指数型。
(6)O(log2n),表示对数型。
(7)O(nlog2n),表示二维型。
3.最坏时间复杂度
1.4.2 空间复杂度
表示为如下形式。S(n)=O(f(n))
本章小结
1.数据结构研究的是数据的表示形式及数据之间的相互关系。从逻辑结构来看,数据结构包括集合、线性结构、非线性结构等。从存储结构来看,数据结构包括顺序存储、链式存储、索引存储和散列存储四种。
2.集合中不存在数据之间的关系;线性结构的数据元素之间存在着一对一的关系;树型结构的数据元素之间存在着一对多的关系;图型结构的数据元素之间存在着多对多的关系。
3.顺序存储相当于C语言中的一维数组存储;链式存储相当于C语言中的链表存储;索引存储也称为索引查找,包括主表和索引表;散列存储也称为数据查找,是用构造函数的方法得到关键字的地址。
4.算法的评价指标首先是正确性,然后是健壮性、可读性、高效率和低存储量。
5.时间复杂度和空间复杂度通常采用数量级的形式来表示,若一个算法的时间复杂度和空间复杂度越优,则算法的执行效率就越高。
三、编程题
1.将n个数按升序输出,并分析它的时间复杂度。
function orderArray($arr) {
$count = count($arr);
$temp = 0;
// 外层控制排序轮次
for ($i = 0; $i < $count - 1; $i ++) {
// 内层控制每轮比较次数
for ($j = 0; $j < $count - 1 - $i; $j ++) {
if ($arr[$j] > $arr[$j + 1]) {
$temp = $arr[$j];
$arr[$j] = $arr[$j + 1];
$arr[$j + 1] = $temp;
}
}
}
return $arr;
}
function orderNumber($a1,$a2,$a3,$a4) {
$arr = array($a1,$a2,$a3,$a4);
$rs = orderArray($arr);
echo '<b>'.$rs[0].$rs[1].$rs[2].$rs[3].'</b>';
}
————————————————
原文链接:https://www.cnblogs.com/zdz8207/p/php-order-number.html
2.求10个数中的最大值,并分析它的时间复杂度。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,j,MAX=0;
int arry[10];
printf("Please input the arry[]:");
for (i = 0; i < 10; i++)
{
scanf("%d",&arry[i]);
}
MAX = arry[0];
for (j = 1; j < 10; j++)
{
if (arry[j]>MAX)
{
MAX = arry[j];
}
}
printf("%d\n",MAX);
system("pause");
return 0;
}
————————————————
原文链接:https://blog.csdn.net/Python_programer/article/details/85040990
3.求1到10的阶乘之和,并分析它的时间复杂度。
#include<stdio.h>
int main()
{
double a,b=1,sum=0;
for(a=1;a<=10;a++)
{
b = a*b; /* 原理:1!等于1乘以1,2!等于1!乘以2,3!等于2!乘以3,以此类推 ,10!等于9!乘以10 */
sum = sum+b; /* 依次将1到10的阶乘相加 */
}
printf("%lf\n",sum);
return 0;
}
————————————————
原文链接:https://blog.csdn.net/bestGP/article/details/90117013