数据结构与算法的基础概念

一·数据结构

1·1概述
数据结构是数据存在的形式
1·2
数据:数据是信息的载体。大概分为两类:数值型数据(主要用于数学计算的数据)和非数值型数据(如视频,图片,音频等)
数据元素:是数据的基本单位,一个数据元素可由若干不可分割的数据项组成。例如,一个菜单就是一个数据元素,而菜单中每一个菜的名字,材料等就称为数据项。
数据结构:指相互间存在一种或多种关系的数据元素的集合。数据结构有以下4种基本结构:
(1)集合结构:数据元素之间存在着“属于同一个集合”的关系。如数学中的整数集合等。
(2)线性结构:数据元素间存在着“一对一”关系。如数据结构中的链表,线性表,和数组等。
(3)树形结构:数据间存在着“一对多”的关系。如二叉树,哈夫曼树等,每个结点就是树形结构的元素。
(4)图形结构:数据元素之间存在着“多对多”的关系。如铁路网这种互相交错的网,上面每个结点代表一个站点,每个站点就是一个图形结构的数据元素。
注意:即使集合是由相同数据组成的,但只要定义的关系不同,如一个是树形结构,一个是图形结构,就不是同一数据结构。
1.3抽象数据类型(根据程序设计模式,C语言并不适合来学数据结构与算法,因为C语言很难像面向对象的语言如JAVA,C++等那样。运用抽象数据类型,将数据与算法彻底分开,而是混合在一起,使得算法无法实现最优)
抽象数据类型:指一个数学模型以及定义在此数学模型上的一组操作,类似于抽象类。使用它的人只关心它的逻辑特征,而不需要了解它的存储方式。只描述数据对象集和相关操作,并不设及“如何做到”的问题。例如一个矩阵,只关心矩阵是多少行多少列,是求矩阵相加还是将矩阵转置,而不关心这个关于矩阵的函数是C语言写的,还是JAVA写的,也不关系这个矩阵是以数组方式存储还是十字链表还是邻接表方式存储。

二·算法

2.1算法概述

算法是解题的步骤。规定了某一特定类型问题的一系列运算。设计一个算法,一般要经过设计,确认,分析,编码,测试,调试和计时等阶段。

2.2算法特征:

(1)有穷性:对于合法的输入,算法必须在经过有限步后结束

 (2)确定性:算法的每一步,都必须有确定的含义,对于同一个输入,只能有相同的输出

 (3)输入:一个算法有零个或多个输入,零个可以是在编程时给定初值。

 (4)输出:一个算法有一个或多个输出,没有输出的算法是没有意义的。

 (5)可行性:算法中的操作都可以实现

2.3算法所用时间分析

2.3.1什么是好的算法

空间复杂度:根据算法写成的程序在执行时占用存储单元的长度。这个长度往往与输入数据的规模有关。空间复杂度过高的算法可能导致使用的内存超限,造成程序非正常中断或崩溃。

时间复杂度:根据算法写成的程序在执行时耗费的时间有关。对于同一个问题,不同的算法,时间复杂度往往差别很大。

由于一般只追求实现算法的大概时间,从而来选用最优算法,所以算法复杂度一般用渐进表示法。

(1)T(n)=O(f(n))表示存在常数C>0,n0>0使得当n>=n0时有T(n)>=c*f(n),可以理解为c*f(n)为T(n)的一个上界。如一个程序的执行时间为T(n)=3n^3+n^2+n,则复杂度为O(n^3)

(2)T(n)=Ω(g(n))表示存在常数C>0,n0>0使得当n>=n0时,有T(n)>=C(f(n)),可以理解为C(f(n))为T(n)的下界。
(3)T(n)=⊙(h(n))表示同时有T(n)=O(f(n))和Ω(h(n))
复杂度一般有以下几种表现形式:
2.3.2运行时间法则:
(1)赋值语句运行时间:
每一条赋值语句运行时间为1
例如:X=3;
(2)for循环时间
一次for循环的运行时间至多是该for循环内语句(包括测试)的运行时间乘以迭代的次数
例如:for(i=0;i<n;i++)
                k+=i;
(3)嵌套for循环的时间
对于嵌套for循环,有多少个for,就有几次方的循环
例如:for(i=0;i<n;i++)
        {
              for(j=0;j<n;j++)
              k+=j;

        }

复杂度为o(n^2)

(4)顺序语句的运行时间

对于顺序语句,将各个语句的求和时间求和即可

由于算法复杂度,采用渐进方法,所以以最复杂的表示来表示整个程序的复杂度

(5)if-else语句的运行时间

取决于if条件判断的复杂度和各分支的复杂度

注意少用递归,递归特别占用内存,并且递归的复杂度一般难以计算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值