大话数据结构之一(绪论、算法)

摘要:
数据结构简介数据结构是彼此具有一个或多个特定关系的数据元素的集合编程=数据结构+算法数据结构实际上是研究非数值计算的编程问题的操作对象,数据元素是构成具有一定意义的数据的基本单元,抽象数据类型体现了编程中问题分解、抽象和信息隐藏的特点。计算机计时器用于比较由不同算法编译的程序的运行时间。

数据结构绪论

数据结构是相互之间存在一种或多种特定关系的数据元素的集合

程序设计=数据结构+算法

数据结构事实上就是一门研究非数值计算的程序设计问题的操作对象,以及它们之间的关系和操作等相关问题的学科。

数据是描述客观事件的符号,是计算机中可以操作的对象,是能被计算机识别,并输入能计算机处理的符号集合,也就是说数据必须具备两个前提:

  1. 可以输入到计算机中
  2. 能被计算机程序处理

数据

数据元素是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理,也被称为记录

数据项:一个数据元素可以由若干个数据项组成

数据项是数据不可分割的最小单位

数据对象:是性质相同的数据元素的集合,是数据的子集

大话数据结构之一(绪论、算法)第1张

不同数据元素之间不是独立的,而是存在特定的关系,我们将这些关系称为结构

数据结构:是相互之间存在一种或多种特定关系的数据元素的集合

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

  • 集合结构:集合结构中的数据元素除了同属于一个集合外,它们之间没有其它关系
  • 大话数据结构之一(绪论、算法)第2张
  • 线性结构:线性结构中的数据元素之间是一对一的关系
  • 大话数据结构之一(绪论、算法)第3张
  • 树性结构:树性结构中的数据元素之间是一对多的层次关系
  • 大话数据结构之一(绪论、算法)第4张
  • 图形结构:图形结构中的数据元素是多对多的关系
  • 大话数据结构之一(绪论、算法)第5张

物理结构:是指数据的逻辑结构在计算机中的存储结构。

  • 顺序存储结构:是把数据元素存储在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的
  • 大话数据结构之一(绪论、算法)第6张
  • 链式存储结构:是把数据元素存储在任意的存储单元里,这组存储单元可以是连续的,也可是不连续的。
  • 大话数据结构之一(绪论、算法)第7张

数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。

  1. 原子类型:是不可再分解的基本类型
  2. 结构类型:由若干个类型组合而成,是可以再分解的。 

抽象是指抽取出事物具有的普遍性的本质。(抽取的意义在于数据类型的数学抽象特性)

抽象数据类型(Abstract Data Type ADT):是指一个数据模型及定义在该模型上的一组操作。

抽象数据类型体现了程序设计中问题分解、抽象和信息隐藏的特征。

大话数据结构之一(绪论、算法)第8张

算法

算法:是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。

算法的特性

  1. 输入:具有零个或多个输入
  2. 输出:至少有一个或多个输出
  3. 有穷性:在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成
  4. 确定性:算法的每一个步骤都具有确定的含义,不会出现二义性
  5. 可行性:算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限的次数完成

算法的设计要求

  1. 正确性:至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案
  2. 可读性:算法设计的另一个目的是为了全球阅读、理解和交流
  3. 健壮性:当输入数据不合法时,算法也能够做出相关处理,而不是产生异常或莫名其妙的结果
  4. 时间效率高和存储量低:设计算法应该在尽量满足时间效率高和存储量低的需求 

算法效率的度量方法

  1. 事后统计方法:通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低(不科学、不准确)
  2. 事前分析估算方法:在计算机程序编制前,依据统计方法对算法进行估算

程序在计算机运行的时间取决于以下因素:

  1. 算法采用的策略、方法
  2. 编译产生的代码质量
  3. 问题的输入规模
  4. 机器执行指令的速度

也就是说一个程序的运行时间依赖于算法的好坏和问题的输入规模,最终在分析程序的运行时间时,最重要的是把程序看成是独立于程序设计语言的算法或一系列的步骤

算法时间复杂度

大话数据结构之一(绪论、算法)第9张

在判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,而更应该关注主项的阶数

大话数据结构之一(绪论、算法)第10张

如何分析一个算法的时间复杂度呢?方法就是:

大话数据结构之一(绪论、算法)第11张

常用时间复杂度分析

单纯的分支结构(不包含在循环结构中),其时间复杂度都是O(1)

分析算法的复杂度,关键是要分析循环结构的运行情况

纯性阶

            int i;
            for (i = 0; i < n; i++)//时间复杂度为O(n)
            { }

对数阶

            int count = 1;
            while (count<n)//由于count乘2之后,就距离n更近了一步,也就是2的x次方等于2 x=log2的n
                //所以时间复杂度为O(logn)
            {
                count = count * 2;
            }

平方阶

            int i, j;
            for (i = 0; i < n; i++)//时间复杂度为O(n的平方)
            {
                for (j = 0; j < n; j++)
                {
                    /*这里面的代码为时间复杂度为O(1)的程序步骤序列*/
                }
            }

分析一个相对复杂一点儿的......

        void fuc(int cout)//这个函数的时间复杂度为O(n)
        {
            for (int j = 0; j < n; j++)
            {
                /*这里面的代码为时间复杂度为O(1)的程序步骤序列*/
            }
        }
            n++;//执行次数为1
            fuc(n);//执行次数为n
            for (i = 0; i < n; i++)
            {
                fuc(i);//整个的执行次数为n2
            }
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < n; j++)//当i=0,内循环执行n 当i=1内循环执行n-1次...
                    //所以总的执行次数为n+(n-1)+(n-2)+....+1=(n+1)n/2
                {
                    /*这里面的代码为时间复杂度为O(1)的程序步骤序列*/
                }
            }

上述代码总的执行次数为1+n+n的平方+n(n+1)/2=3/2n的平方+3/2n+1所以最终的时间复杂度为O(n的平方)

常见的时间复杂度

大话数据结构之一(绪论、算法)第12张

大话数据结构之一(绪论、算法)第13张

最坏情况运行时间是一种保证,也就是说运行时间不会比最坏情况下运行更长了。

平均运行时间是所有情况中最有意义的,因为它是期望的运行时间

算法的空间复杂度

大话数据结构之一(绪论、算法)第14张

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Mysql 实现分页功能Java集合-单例模式斗地主&amp;amp;Collections类的shuffle方法了解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

千人千面、个性化推荐,解读数据赋能商家背后的AI技术

12月6~7日,由阿里巴巴集团、阿里巴巴技术发展部、阿里云云栖社区联合主办,以“2016 双 11 技术创新”为主题的阿里巴巴技术论坛,来自商家事业部的技术总监魏虎给大家分享了数据赋能商家背后的AI技术。首先对大数据和人工智能进行了简要介绍,接着着重分析了客户运营平台,包括实时分群算法、match和rank框架以及千人千面技术,最后讲解了千牛头条、服务市场...

ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致”

"将页面显示的GridView中的数据,导出到Excel表格中"时遇到这样一个错误: C# 导出Excel文件 打开Excel文件格式与扩展名指定格式不一致。具体提示如图:   解决办法:这里采用"修改注册表的方法"解决此问题,这并没从根上解决问题: 1、打开注册表编辑器方法:开始 -> 运行 -> 输入regedit -> 确定 2、找...

Linux系统下查找最近修改过的文件

Linux的终端上,没有windows的搜索那样好用的图形界面工具,但find命令确是很强大的。 比如按名字查找一个文件,可以用 find / -name targetfilename 。 唉,如果只知道名字,不知道地点,这样也不失为一个野蛮有效的方法。 按时间查找也有参数 -atime 访问时间 -ctime 改变状态的时间 -mtime修改的时间。但...

【Guava】使用Guava的RateLimiter做限流

一、常见的限流算法 目前常用的限流算法有两个:漏桶算法和令牌桶算法。 1.漏桶算法 漏桶算法的原理比较简单,请求进入到漏桶中,漏桶以一定的速率漏水。当请求过多时,水直接溢出。可以看出,漏桶算法可以强制限制数据的传输速度。 2.令牌桶算法 令牌桶算法的原理是系统以一定速率向桶中放入令牌,如果有请求时,请求会从桶中取出令牌,如果能取到令牌,则可以继续完成请求...

那些java中的常用类(一)

本节介绍一下java中那些常用的类,包括:系统相关类(System、Runtime)、日期时间类(Date等)、Object、Math、Random、File、枚举类(Enum) 1.系统相关类 System类 System类是一些与系统相关的属性和方法的集合,且System类中所有的属性和方法都是静态的,要想引用这些属性和方法,直接使用System类...

某数据库管理软件离线注册分析

序列号  libcc.dll sub_1818810F0 4x4=16字节 通过10个字节的数据来生成的。 1. data[0] 和 data[1]必须分别为 `0x68` 和 `0x2A`。这两个字节为Navicat的标志数。 2. data[2]、data[3]和 data[4]可以是任意字节,你想设成什么都行。 3. data[5]和 data[6]...