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

数据结构绪论

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

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

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

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

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

数据

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

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

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

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

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

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

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

  • 集合结构:集合结构中的数据元素除了同属于一个集合外,它们之间没有其它关系
  • 线性结构:线性结构中的数据元素之间是一对一的关系
  • 树性结构:树性结构中的数据元素之间是一对多的层次关系
  • 图形结构:图形结构中的数据元素是多对多的关系

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

  • 顺序存储结构:是把数据元素存储在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的
  • 链式存储结构:是把数据元素存储在任意的存储单元里,这组存储单元可以是连续的,也可是不连续的。

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

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

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

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

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

算法

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

算法的特性

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

算法的设计要求

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

算法效率的度量方法

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

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

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

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

算法时间复杂度

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

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

常用时间复杂度分析

单纯的分支结构(不包含在循环结构中),其时间复杂度都是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的平方)

常见的时间复杂度

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

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

算法的空间复杂度

时间: 2024-10-22 18:21:50

大话数据结构之一(绪论、算法)的相关文章

图的基础算法(大话数据结构笔记)

概述 线性表的每个元素有线性关系,每个数据元素只有一个直接前去和一个直接后继.树的数据元素之间有着明细那的层次关系,并且每层上的数据元素可能和下一层中多个元素相关,但只能和上一层中一个元素相关.这和一对父母可以有很多孩子,但每个孩子却只能有一对父母是一个道理.可现实中,人与人之间关系复杂,不是简单一对一,一对多的关系.这种复杂关系更适合用图来表示.在图结构中,节点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关.如下图所示:无向边:Edge (vi,vj)有向边:也叫弧,Arc. <v

KMP算法学习记录----《大话数据结构》部分匹配表学习部分

如需转载,请保留本文链接. 首先先将<大话数据结构>关于KMP算法的讲解部分贴上,本文不提供下载链接,也不会将电子书作为资料留百度云,需要电子书的各位,请自行寻找电子版. 关于上述的KMP算法种的next数组的推导部分,一直不是很明白,本贴是关于上述部分的学习推导记录. 以书中字符串为例: 1|2|3|4|5|6|7|8|9| a|b|a|b|a|a|a|b|a| 0|1|1|2|3|4|2|2|3| string T = "ababaaaba"; int i = 1;j

《大话数据结构》 第一讲.数据结构绪论 (读书笔记)

大话数据结构 导读笔记 第一讲: 一.基本概念和术语 (1)数据元素:是组成数据的.有一定意义的基本单位,在计算机中通常作为整体处理.也被称为记录.   比如,在人类中,什么是数据元素呀?当然是人了. (2)数据项:一个数据元素可以由若干个数据项组成.   比如人这样的数据元素,可以有眼.耳.鼻.嘴.手.脚这些数据项,也可以有姓名.年龄.性别.出生地址.联系电话等数据项,具体有哪些数据项,要视你做的系统来决定. 数据项是数据不可分割的最小单位.在数据结构这门课程中,我们把数据项定义为最小单位,是

《大话数据结构》学习笔记 排序

排序的严格定义:  假设含有n个记录的序列为{r1,r2,......,rn},对应的关键字分别为{k1,k2......,kn},需确定1,2,......,n的一种排列p1,p2,......,pn,使其相应的关键字 满足Kp1<=Kp2<=......Kpn关系,即使得序列成为一个按关键字有序的序列(rpq,rp2,......rpn),此操作称为排序.  排序的稳定性:内排序与外排序(根据记录是否全部放置在内存中). 根据排序中的主要操作,可以分为插入排序类(直接插入排序->希尔

【数据结构】绪论部分

今天由我来跟大家讲一下数据结构的绪论部分吧.数据结构整体复习主要靠理解.理解了学习起来其实是很轻松的事情,学进去了你也会发现很好玩.这篇只是个结构概括,理解就行. 1.1 基本概念 1.数据:即信息. 2.数据元素:数据的基本单位.如:一个学生记录就是一个数据元素,由学号.姓名等数据项构成(数据项为构成数据元素的不可分割的最小单位). 3.数据对象:相同性质的数据元素集合.数据的子集. 4.数据类型:一个值的集合和在此集合上一组操作的总称. 5.抽象数据类型:ADT.一个模型和在此模型上的一组操

大话数据结构读书笔记

大话数据结构读书笔记 编程基础: 数据结构 算法 1 线性表 //顺序储存结构的结构代码: #define MAXSIZE 20//储存空间的起始分配量 typedef int ElemType;//ElemType类型根据实际类型而定,这里假设是int typedef struct{ ElemType data[MAXSIZE];//数组储存元素,最大值为MAXSIZE int length;/线性表当前长度: }SqList; //顺序存储结构需要三个属性: //1存储空间的起始位置:数组d

大话数据结构pdf

下载地址:网盘下载 本书为超级畅销书<大话设计模式>作者程杰潜心三年推出的扛鼎之作!以一个计算机教师教学为场景,讲解数据结构和相关算法的知识.通篇以一种趣味方式来叙述,大量引用了各种各样的生活知识来类比,并充分运用图形语言来体现抽象内容,对数据结构所涉及到的一些经典算法做到逐行分析.多算法比较.与市场上的同类数据结构图书相比,本书内容趣味易读,算法讲解细致深刻,是一本非常适合自学的读物. 本书以一个计算机教师教学为场景,讲解数据结构和相关算法的知识.通篇?一种趣味方式来叙述,大量引用了各种各样

【学习总结】《大话数据结构》- 第3章-线性表

[学习总结]<大话数据结构>- 总 启示: 线性表:零个或多个数据元素的有限序列. 目录 3.1 开场白 3.2 线性表的定义 3.3 线性表的抽象数据类型 3.4 线性表的顺序存储结构 3.5 顺序存储结构的插入与删除 3.6 线性表的链式存储结构 3.7 单链表的读取 3.8 单链表的插入与删除 3.9 单链表的整表创建 3.10 单链表的整表删除 3.11 单链表结构与顺序存储结构优缺点 3.12 静态链表 3.13 循环链表 3.14 双向链表 3.15 总结回顾 3.16 结尾语 -

数据结构-各类排序算法总结[结局]

各类排序算法总结 五.分配类排序->基数排序: 基数排序是一种借助于多关键码排序的思想,是将单关键码按基数分成"多关键码"进行排序的方法.基数排序属于"低位优先"排序法,通过反复进行分配与收集操作完成排序. 对于数字型或字符型的单关键字,可以看成是由多个数位或多个字符构成的多关键字, 此时可以采用这种"分配-收集"的办法进行排序,称作基数排序法.其好处是不需要进行关键字间的比较. 例如:对下列这组关键字{278, 109, 063, 930

数据结构-各类排序算法总结[续]

各类排序算法总结 三.交换类排序[接上] 2.快速排序 快速排序是通过比较关键码.交换记录,以某个记录为界(该记录称为支点),将待排序列分成两部分.其中,一部分所有记录的关键码大于等于支点记录的关键码,另一部分所有记录的关键码小于支点记录的关键码.我们将待排序列按关键码以支点记录分成两部分的过程,称为一次划分.对各部分不断划分,直到整个序列按关键码有序. 如果每次划分对一个元素定位后,该元素的左侧子序列与右侧子序列的长度相同,则下一步将是对两个长度减半的子序列进行排序,这是最理想的情况! [算法