一、数据结构简介

1.数据的特点、概念和关系

1.1.数据的概念和特点

在计算机中,数据是指被程序操作的对象,用于描述客观事物。
特点:可以输入到计算机、可以被程序处理。

1.2.数据中的新概念

—数据元素:组成数据的基本单元
—数据项:一个数据元素有若干数据项构成
—数据对象:性质相同的数据元素集合
实例分析:
[objc] view plain copy
struct student // 数据类型
{
int age;
charchar *name;
};
student s // 数据元素
student sArrsy[10]; // 数据对象
s.name = "Eric"; // 数据项
s.age = 23;

1.3.数据间的关系

数据结构指的是数据对象中数据元素之间的关系,数据之间不是独立的,存在特定的关系(组合、线性、树状、图...),即结构。
数据结构是相互间存在特定关系的数据的集合,分为逻辑结构和物理结构。

(1)、逻辑结构

数据额结构(01)_数据结构简介和算法效率度量
集合结构:数据元素之间没有特别的关系,仅同属相同集合。
线性结构:数据元素间是一对一的关系
树形结构:数据元素间存在一对多的层次关系
图形结构:数据元素之间是多对多的关系

(2)、物理结构

物理结构是逻辑结构在计算机中存储形式,分为顺序存储结构和链式存储结构。
顺序存储结构将数据存储在地址连续的存储单元里。
链式存储结构将数据存储在任意的存储单元里,通过保存地址的方式找到相关联的数据元素。
数据额结构(01)_数据结构简介和算法效率度量

二、算法简介

算法是特定问题求解步骤的描述,是独立存在的一种解决问题的方法和思想。

1、算法的特性

输入:有0个或多个输入
输出:至少有1个或多个输出
有穷性:算法在有限的步骤后应该自动结束而不会无限循环。
确定性:算法中的每个步骤都有确定的含义,不会出现二义性
可行性:算法的每一步都是可行的
正确性:算法对于合法数据能够得到满足要求的结果,能够处理非法输入,并得到合理的结果。
可读性:算法要便于阅读、理解和交流
健壮性:算法不应该得到莫名其妙的结果
性价比:利用最少的资源得到满足要求的结果

2、算法效率的度量

效率评估是工程中算法最重要的附加特性。

(1)、事后统计法

比较不同算法对同一组输入数据的运行处理时间。
缺点:
A、为了获得不同算法的运行处理时间必须编写相应程序
B、运行处理时间严重依赖硬件以及运行时环境
C、算法的测试数据选取困难

(2)、事前分析统计

依据统计的方法对算法效率进行评估
影响算法效率的主要因素:
A、算法采用的策略和方法
B、问题的输入规模
C、编译器产生的代码
D、计算机的执行速度
算法效率的简单估算:
数据额结构(01)_数据结构简介和算法效率度量
数据额结构(01)_数据结构简介和算法效率度量
数据额结构(01)_数据结构简介和算法效率度量
三种求和算法的关键部分的操作数量分别为2n,n,1。随着问题规模的增大,操作数量的差异会越来越大,效率差异也会越来越大。
数据额结构(01)_数据结构简介和算法效率度量
不同算法操作数量的对比
算法操作数量对比的实例一:
数据额结构(01)_数据结构简介和算法效率度量
n<=3时,算法B优于算法A。随着n的规模增大,算法A优势比较明显。
算法操作数量对比的实例二:
数据额结构(01)_数据结构简介和算法效率度量
n=1时,算法C与算法D效率相同。随着n规模的增大,算法C优势明显优于算法D。
判断算法的效率时,操作数量中的常数项和其他次阶项常常可以忽略,只需要关注最高阶项。

3、算法的复杂度

(1)算法的时间复杂度

算法时间复杂度是算法运行后对时间需求量的定性描述。
由于主要关注算法的效率问题,因此主要讨论算法的时间复杂度。
O表示法
算法的效率严重依赖于操作(Operations)数量,操作数量的估算可以作为时间复杂度的估算,在判断时首先关注操作数量的最高阶项。
O(2)==>O(1)
O(3n+3)==> O(3n)==>O(n)
O(3n^2+n+4)==>O(n^2)
常见的时间复杂度:
数据额结构(01)_数据结构简介和算法效率度量
练习题目:

(2)算法的空间复杂度

算法空间复杂度是算法运行后对空间需求量的定性描述。
通常使用S(n)表示算法的空间复杂度。使用时间复杂度的推导方法推导空间复杂度。
当算法所需的内存空间大小为常数时,算法的空间复杂度为S(1)。
通常情况下,算法的时间复杂度更受关注。可以通过增加额外空间降低时间复杂度。
算法是解决具体问题的步骤,数据结构是算法解决问题的载体。

4、算法实例

一个数组中存储着1——1000的数字,每个数字可能出现多次或者不出现,找出出现次数最多的数字。
void search(int array[], int len)
{
  //总计可能出现1000种可能值
  int sp[1000] = {0};
  int max = 0;
  for(int i = 0; i < len; i++)
  {
      //遍历数组,数组中某个数组出现一次增加统计1次
      sp[array[i] - 1]++;
  }
  for(int i = 0; i < 1000; i++)
  {
      if(max < sp[i])
      {
          max = sp[i];
      }
  }
  for(int i = 0; i< 1000; i++)
  {
      if(max == sp[i])
      {
          cout << "Number:" << i + 1 << endl;
          cout << "Count:" << max << endl;
      }
  }
}

使用空间换时间,算法的时间效率为O(n)。
参考自DT课程。