数据结构之基础篇-基本概念与术语

一. 概念

       俗话说:程序设计 = 数据结构 + 算法,那对数据结构的理解对程序员来说当然是至关重要的,可到底什么是数据结构呢?

  数据结构分为两部分:数据+结构。

  数据,概念:是描述客观事物的符号,是计算机中就可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合(这概念明明都是中文,咋那么难懂)。其实呢,按我的理解,我们日常中用到的,存在mysql中的是数据, 存在redis中的是数据,存在文件中的是数据,甚至我们电脑上的存的声音、图片、视频等都是数据。

       结构,概念:简单的理解就是关系,比如分子结构,就是说组成分子的原子之间的排列方式。

       数据结构,概念:相互之间存在某种或多种关系的数据元素的组合。这样一想我们平常中用到的数组,队列,集合,栈等其实都是数据结构, 他们存的是数据,并且具有某种关系。。。

二. 分类

      数据结构根据视点的不同:分为逻辑结构和物理结构。

      逻辑结构:数据对象中数据元素之间的相互关系

                       分为: 集合结构:集合结构中的数据元素除了同属一个集合外,他们之间没有其他关系,类似于数学中的集合

                                   线性结构:数据元素之间是一对一的关系

                                   树形关系:数据元素之间存在一种一对多的层次关系

                                   图形结构:数据元素之间是多对多的关系

        物理结构:也叫存储结构,是指数据的逻辑结构在计算机中的存储形式

                         分为:顺序存储结构:是把元素存放在地址连续的存储单元里,其数据建的逻辑关系和物理关系是一致的

                                   链式存储结构:把数据元素存放在任意的存储单元里,这组存储单元可以使连续的,也可以是不连续的。因为这组数据的存储关系并不能反映其逻辑关系,因此需要用一个存放数据元素的地址

三.其他概念

          数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。数据类型是按照值的不同进行划分的,在高级语言中,每个变量、常量和表达式都有各自的取值范围。那为什么当初设计计算机语言的人会考虑到语言类型呢,就比如大家住房子,都希望房子越大越好,但显然,没有钱,考虑房子是没有意义的,于是商品房就出现了各种各样的房型,有别墅,单间,胶囊公寓等来满足不同人的需求。同样Z爱计算机中,内存并不是无限大的,你要计算一个如 1+1=2这样的整型数字的加减乘除运算,显然不需要开辟很大的内存空间,所以就考虑对数据进行分类。

       这里插一个概念:计算机人们总说抽象,抽象是什么呢?是指抽取出事物具有的普遍性本质

 

四.算法概念

       上面我们也说了数据结构与算法是相辅相成的, 那什么是算法呢?首先让我们做一道题:写一个求1+2+3+...+100结果的程序,大多数人第一时间想到的可能就是暴力解法

       我们用PHP简单的实现它:

$sun=0;
$n=100;
forreach($i=1;$i<$n;$i++){
    $sum +=$i;
}
echo $num;

       这个其实也就算是算法,但是这样写是不是高效的呢,是不是最好的呢,我们看一下另一种算法:利用等差数列

sum    = 1       +   2  +   3    + ...+   99   +  100
sum    = 100   +   99 +  98   + ...+   2     +    1
2*sum = 101  +   101+  101 +... +  101  +  101
所以sum=101*100/2 = 5050

     利用程序实现就是:

$sum=0;
$n=100;
$sum = ($n+1)*$n/2;
echo $sum;

      这样我们就看出,算法作重要的就是找出最高效的解决方式去解决问题。

      算法的特性:输入、输出:具有零个或多个输入

                     有穷性 :在执行有限的步骤之后,自动结束而不会出现无心循环,并且每一个步骤在可接受的时间内完成

        确定性:每一个步骤都具有确定的含义,不会出现二义性

                     可行性 :每一步都必须是可行的,也就是说,每一步都能够通过执行有限的次数完成

        算法时间复杂度:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n 的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间度量,记作:T(n)=O(f(n)).它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,陈祚算法的渐进时间复杂度,简称为时间复杂度,其中f(n)是问题规模你的某个函数。

       推导大O阶:1.用常量1取代运行时间中的所有加法常量   2.在修改后的运行次数函数中,只保留最高阶项       3.如果最高阶项存在且不是1,则去除与这个项相乘的常数

        常见的时间复杂度(所消耗时间按先从小到大依次是):O(1)【常数阶】<O(logn)【对数阶】<O(nlogn)【nlogn阶】<O(n^2)【平方阶】<O(n^3)【立方阶】<O(2^n)【指数阶】<O(n!)【阶乘阶】<O(n^n)

        算法空间复杂度:通过计算算法所需的存储空间实现,计算公式记作:S(n) = O(f(n)),其中n为问题的规模,f(n)为语句关于n所占存储空间的函数

 

 

 

  

                                         

                                   

                                    

 

posted @ 2020-08-19 11:47  echoppy  阅读(268)  评论(0编辑  收藏  举报