1.数据结构概念
1.1 数据结构的起源
数据结构主要用于研究非数值计算程序问题中的操作对象以及它们之间的关系,不是研究复杂的算法
1.2基本概念
数据--程序的操作对象,用于描述客观事物(int a ,int b)
数据的特点: 1、可输入到计算机内 2、可被计算机程序处理
数据是一个抽象的概念,将其分类后,得到程序设计语言中的类型。如,int float char等等
数据元素:组成数据的基本单位
数据项:一个数据元素由若干数据组成
数据对象:性质相同的元素的集合
//来自结构体课堂代码
//声明一个结构体类型
struct _MyTeacher //一种数据类型
{
char name[32];
char tile[32];
int age;
char addr[128];
};
int main()
{
struct _MyTeacher t1; //数据元素
struct _MyTeacher tArray[30]; //数据对象
memset(&t1,0,sizeof(t1));
strcpy(t1.name,"name"); //数据项
strcpy(t1.addr,"addr"); //数据项
strcpy(t1.title,"addr"); //数据项
t1.age = 1;
}
数据结构指数据对象中数据元素之间的关系
1.3数据的逻辑结构
依据数据元素之间的关系,分为四种基本数据结构
1、集合--数据元素之间除“同属一个集合外”,无其他关系
2、线性结构--一个对一个,如,线性表,栈,队列
3、树形结构--一个对多个,如树
4、图形结构--多个对多个,如图
1.4数据的物理结构
即存储结构,是数据的物理结构在计算机存储器内的表示(映像).依赖于计算机
主要分为:顺序、链式、索引、散列
顺序存储--借助元素在存储器中的相对位置来表示,
链式存储--借助指示元素存储地址的指针来表示数据
算法设计-------逻辑结构
算法实现--------物理结构
1.5数据的运算
插入、删除、修改、查找、排序
2 算法
2.1基本概念
对特定问题求解步骤的描述
在计算机中国表现为指令的有限序列
算法是独立存在的一种解决问题的方法和思想
2.2算法和数据结构的区别
数据结构知识静态的描述了数据元素之间的关系
高效的程序需要在数据结构的基础上设计和选择算法
---程序= 数据结构+算法
2.3算法的特性:
输入:具有0个或者多个输入
输出:至少有一个或多个输出
有穷性:算法在有限的步骤之后会自动结束而不会无限循环
确定性:算法的每一步都有确定的含义,不会出现二义性。
可行性:算法的每一步都是可行的。
2.4算法效率的质量
1、事后统计法
比较不同算法对同一组输入数据的运行处理时间
事前分析估算
//算法最终编译成具体的计算机指令
//每一个指令,在具体的计算机上运行速度固定
//通过具体的n的步骤,就可以推导出算法的复杂度
long sum1(int n)
{
long ret = 0;
int* array = (int*)malloc(n * sizeof(int));
int i = 0;
for(i=0; i<n; i++)
{
array[i] = i + 1;
}
for(i=0; i<n; i++)
{
ret += array[i];
}
free(array);
return ret;
}
long sum2(int n)
{
long ret = 0;
int i = 0;
for(i=1; i<=n; i++)
{
ret += i;
}
return ret;
}
long sum3(int n)
{
long ret = 0;
if( n > 0 )
{
ret = (1 + n) * n / 2;
}
return ret;
}
int main()
{
printf("%d\n", sum1(100));
printf("%d\n", sum2(100));
printf("%d\n", sum3(100));
return 0;
}
int func(int a[], int len)
{
int i = 0;
int j = 0;
int s = 0;
for(i=0; i<len; i++) n
{
for(j=0; j<len; j++) n
{
s += i*j; //n*n
}
}
return s;
}
说明:
1:判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略。
2:在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度。
2、大O表示法
算法效率严重依赖于操作(Operation)数量
在判断时首先关注操作数量的最高次项
操作数量的估算可以作为时间复杂度的估算
3、算法的空间复杂度
算法的空间复杂度通过计算算法的存储空间实现
S(n) = O(f(n))
其中,n为问题规模,f(n))为在问题规模为n时所占用存储空间的函数
大O表示法同样适用于算法的空间复杂度
当算法执行时所需要的空间是常数时,空间复杂度为O(1)
练习2:时间换空间
/*
问题:
在一个由自然数1-1000中某些数字所组成的数组中,每个数字可能出现零次或者多次。
设计一个算法,找出出现次数最多的数字。
*/
方法1:
排序,然后找出出现次数最多的数字
方法2:
void search(int a[], int len)
{
int sp[1000] = {0};
int i = 0;
int max = 0;
for(i=0; i<len; i++)
{
int index = a[i] - 1;
sp[index]++;
}
for(i=0; i<1000; i++)
{
if( max < sp[i] )
{
max = sp[i];
}
}
for(i=0; i<1000; i++)
{
if( max == sp[i] )
{
printf("%d\n", i+1);
}
}
}
int main()
{
int array[] = {1, 1, 3, 4, 5, 6, 6, 6, 2, 3};
search(array, sizeof(array)/sizeof(*array));
return 0;
}
把每个数字出现的次数的中间结果,缓存下来;在缓存的结果中求最大值。 |