前言:数据结构这门课是我当初没有好好去实践的一门课,编程本来就是应该在实战上下功夫的。特地在这个暑假好好 的补一下数据结构相关知识,记住:程序=算法+数据结构
下面讲一下数据结构里面的一些序章中的实用概念
1、实用概念
1.1、基本概念
数据:程序的操作对象,其特点是可以输入到计算机,并且可以被计算机程序处理
数据元素:组成数据的基本单位
数据项:一个数据元素有若干数据项组成
数据对象:性质相同的数据元素的集合
结构:数据元素之间的关系
数据结构:数据对象中数据元素 之间的关系
具体程序如下:
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.tile, "addr"); //数据项
t1.age = 1;
}
1.2、数据的逻辑结构
独立于计算机的一种结构,有四种基本结构:集合、线性结构、树形结构、图状结构
1.3数据的物理结构
物理结构表示数据在计算机内存中的实际存储位置,主要可分为:顺序、链式、索引、散列
1.4、数据的运算
在逻辑结构上定义操作,在存储结构上实现,常用的数据运算:插入、删除、修改、查找、排序
2、算法
2.1概念:特定问题的求解步骤的描述,在计算机中表现为指令的有限序列
2.2性质:输入、输出、有穷性、确定性、可行性
2.3算法的性能标准:正确性、可使用性、可读性、效率、健壮性、简单性
2.4算法的事前估计:时间复杂度
long sum1(int n)//时间复杂度为2n+4
{
long ret = 0;//1
int* array = (int*)malloc(n * sizeof(int));//1
int i = 0;//1
for (i = 0; i<n; i++)
{
array[i] = i + 1;//n
}
for (i = 0; i<n; i++)
{
ret += array[i];//n
}
free(array);//1
return ret;
}
long sum2(int n)//时间复杂度n+2
{
long ret = 0;//1
int i = 0;//1
for (i = 1; i <= n; i++)
{
ret += i;//n
}
return ret;
}
long sum3(int n)//时间复杂度2
{
long ret = 0;//1
if (n > 0)
{
ret = (1 + n) * n / 2;//1
}
return ret;
}
2.5大O表示法:
算法效率严重依赖操作数量,在判断时首次关注操作数量的最高此项,操作数量的估算可以作为时间复杂度的估算
例如:
O(5) = O(1)
O(2n + 1) = O(2n) = O(n)
O(n2+ n + 1) = O(n2)
O(3n3+1) = O(3n3) = O(n3)
2.6算法的空间复杂度
算法的空间复杂度可以通过计算算法的存储空间实现
空间与时间的策略
多数情况下,算法执行时所用的时间更令人关注
如果有必要,可以通过增加空间复杂度来降低时间复杂度
同理,也可以通过增加时间复杂度来降低空间复杂度
long sum1(int n)//空间复杂度为4n+8--->O(n)
{
long ret = 0;//4
int* array = (int*)malloc(n * sizeof(int));//4*n
int i = 0;//4
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)//空间复杂度8--->O(1)
{
long ret = 0;//4
int i = 0;//4
for (i = 1; i <= n; i++)
{
ret += i;
}
return ret;
}
long sum3(int n)//空间复杂度4---->O(1)
{
long ret = 0;//4
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;
}
2.7、用空间换时间的案例
//设计一个算法使得求出一个既定数组中出现次数最多的数字及其次数
#include<iostream>
#include<stdlib.h>
using namespace std;
void caculate(int a[], int length)
{
int index;
int max = 0;
int sp[100] = {0};
for (int i = 0; i < length; i++)
{
index = a[i] - 1;
sp[index]++;
}
for (int i = 0; i < 100; i++)
{
if (max < sp[i])
max = sp[i];
}
for (int i = 0; i < 100; i++)
{
if (max == sp[i])
{
cout << "出现最多的数字是:" << i +1<< endl;
cout << "出现的次数为:" << sp[i];
}
}
}
int main()
{
int arry[] = { 1,3,4,5,7,8,5};
caculate(arry,sizeof(arry)/sizeof(int));
system("pause");
return 0;
}
下集预告:线性表