热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

程序核心数据结构与算法

数据结构学科的定义:主要是为研究和解决如何使用计算机处理非数值问题而产生的理论、技术和方法。数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。数据结构由数据元素依某种逻辑

数据结构学科的定义:主要是为研究和解决如何使用计算机处理非数值问题而产生的理论、技术和方法。
数据结构:
是相互之间存在一种或多种特定关系的数据元素的集合。
数据结构由数据元素依某种逻辑关系组织起来,在数据结构上需要定义一组操作(运算)。

  1. 数据:是信息的载体,是计算机加工处理的对象.
  2. 数值数据和非数值数据
    (1)数值数据:包括整数、实数或复数。主要用于工程计算、科学计算。
    (2)非数值数据:包括字符、文字、图形、图象、语音等。
    用于情报检索、企业管理、图形图象、人工智能、远程教育、远程医疗、电子商务、电子图书馆和办公自动化等诸多领域。
  3. 数据元素:组成数据的基本单位。
    一个数据元素可以由若干个数据项组成。
    数据项是数据不可分割的最小单位。
数据结构

1、数据元素间的逻辑关系
2、基本的逻辑结构
集合结构:结构中的元素之间除了“同属于一个集合”的关系外,别无其它关系;
线性结构:结构中的数据元素之间存在一对一的关系。
树形结构:结构中的数据元素之间存在一对多的关系;
图结构:结构中的数据元素之间存在多对多的关系。

《程序核心数据结构与算法》 3KEHXP((PY7UKZXV5C4LKZP.png

3.数据结构包括以下四个方面:
一:数据元素及特性:
是数据结构中的最基本信息单元。
二:数据的逻辑结构:
对数据元素间的逻辑关系的描述。
三:数据的存储表示(存储结构)
物理结构:是指数据的逻辑结构在计算机中的存储形式。
数据在计算机内的组织方式
四:运算的定义和算法
数据结构上的执行的运算和实现
1.2 数据抽象和抽象数据类型
抽象:抽取事物的共同的和实质的东西,忽略其非本质的细节。
数据结构抽象为一种聚集结构
聚集结构:
图结构:图和网
集合结构:集合和字典
树形结构:树、二叉树、堆、优先权队列
线性结构:线性表、堆栈、队列、字符串、数组、文件。

数据结构可分成以下两部分:
(1)数据结构的规范:
逻辑结构和运算的定义
(2)数据结构的实现:
存储结构和运算算法实现

规范指明:做什么
实现解决:怎样做

《程序核心数据结构与算法》 image.png

算法初识

数据结构和算法是战场中的兵法。
码农是指挥作战的将军,代码是士兵和武器。
算法就是独立存在的一种解决问题的方法和思想。
算法的特性:
1、输入:算法具有0个或多个输入
2、输出:算法至少有1个或多个输出
3、有穷性:算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤都可以在可接受的时间内完成
4、确定性:算法中的每一步都有确定的含义 不会出现二义性
5、可行性:算法的每一步都是可行的 也就是说每一步都能够执行有限的次数完成

算法性能标准:

(1) 正确性 算法的执行结果应当满足预先规定的功能和性能要求。
(2) 简明性 一个算法应当思路清晰、层次分明、简单明了、易读易懂。
(3) 健壮性 当输入不合法数据时,应能做适当处理,不至于引起严重后果。
(4) 效率 有效使用存储空间和有高的时间效率。
(5) 最优性 解决同一个问题可能有多种算法,应进行比较,选择最佳算法。

算法效率衡量

算法的空间复杂度:是程序运行从开始到结束所需的存储空间。
存储空间分为:固定部分:常量、简单变量。与问题的实例的特征无关的。
可变部分:算法在某次执行中处理的特定数据的大小和规模有关。
两个含有100个元素的数组相加与含有10个元素的数组相加。
排序的算法中元素的个数可视为该实例的特征。

算法的时间复杂度:是程序运行从开始到结束所需的时间

执行时间反应算法效率:

一个问题的解决可能有多个解决算法,但是程序执行的时间却相差很多,由此判断:实现算法程序的执行时间可以反应出算法的效率,即算法的优劣。
但是如果设备性能低下,两个算法的程序运行时间大致会相同,因此单纯依靠运行运行的时间来比较算法的优劣并不一定是客观准确的。
程序的运行离不开计算机环境(硬件和操作系统)。

时间复杂度和“大O记法”

《程序核心数据结构与算法》 QQ图片20180704214108.jpg.png
《程序核心数据结构与算法》 QQ图片20180704214058.jpg.png
《程序核心数据结构与算法》 QQ图片20180704214614.jpg.png

假定计算机执行算法每一个基本操作的时间是固定的一个时间单位,有多少个基本操作就代表会花费多少时间单位。对于不同的机械环境而言,确切的单位时间是不同的,但是对于算法进行多少个基本操作(即花费多少时间单位)在规模数量级上却是相同的,忽略机械环境影响而客观的反应算法的时间效率。

每台机器执行的总时间不同,但是执行基本运算数量大体相同

“大O记法”:对于单调的整数函数f,如果存在一个整数函数g和实常数c>0,使得对于充分大的n总有f(n)<=c*g(n),就说函数g是f的一个渐近函数(忽略常数),记为f(n) = O(g(n))。也就是说,在趋向无穷的极限意义下,函数f的增长速度收到函数g的约束,亦即函数f与函数g的特征相似。

时间复杂度:假设存在函数g,使得算法A处理规模为n的问题示例所用时间为T(n)=O(g(n)),则称O(g(n))为算法A的渐近时间复杂度,简称时间复杂度,记为T(n)

最重要的是其数量级和趋势。大O表示法 例如n的三次方。100n^3和8n^3。

最坏时间复杂度

算法完成工作最少需要多少基本操作:即最优时间复杂度&#8211;理想状态,无参考价值
算法完成工作最多需要多少基本操作:即最坏时间复杂度&#8211;一种保证,算法在此种程度的基本操作中一定能完成工作。
算法完成工作平均需要多少基本操作:即平均时间复杂度&#8211;全面评价,算法性质,因为应用算法的实例分布可能并不均匀而难以计算。
因此关注最坏时间复杂度。

时间复杂度的几条基本计算规则

1.基本操作,即只有常数项,认为其时间复杂度为O(1)
2.顺序结构,时间复杂度按加法进行计算
3.循环结构,时间复杂度按乘法计算
4.分支结构,时间复杂度取最大值。
5.判断一个算法的效率时,往往只需要关注操作数量的最高此项,其它次要项和常数项可以忽略
6.在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度。

常见时间复杂度

执行次数函数举例 阶 非正式术语
12 O(1) 常数阶
2n+3 O(n) 线性阶
3n2+2n+1 O(n2) 平方阶
5log2n+20 O(logn) 对数阶
2n+3nlog2n+19 O(nlogn) nlogn阶
6n3+2n2+3n+4 O(n3) 立方阶
2n O(2n) 指数阶
注意,经常将log2n(以2为底的对数)简写成logn
O(1)

数据结构

数据元素之间不是独立的,存在特定的关系,这些关系便是结构。数据结构指数据对象中数据元素之间的关系。
数据结构解决的问题:一组数据如何保存,保存形式。
内置数据结构,比如列表、元组、字典
扩展数据结构,比如栈,队列等

算法与数据结构的区别

数据结构只是静态的描述了数据元素之间的关系。
高效的程序需要在数据结构的基础上设计和选择算法。
程序 = 数据结构 + 算法
总结:算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体

抽象数据类型(ADT)的含义是指一个数学模型以及定义在此数学模型上的一组操作。即把数据类型和数据类型上的运算捆在一起,进行封装。引入抽象数据类型的目的是把数据类型的表示和数据类型上运算的实现与这些数据类型和运算在程序中的引用隔开,使它们相互独立。
数据运算的五种:插入、删除、修改、查找、排序

大话数据结构

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


推荐阅读
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 本文将详细介绍多个流行的 Android 视频处理开源框架,包括 ijkplayer、FFmpeg、Vitamio、ExoPlayer 等。每个框架都有其独特的优势和应用场景,帮助开发者更高效地进行视频处理和播放。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • 深入解析Hadoop的核心组件与工作原理
    本文详细介绍了Hadoop的三大核心组件:分布式文件系统HDFS、资源管理器YARN和分布式计算框架MapReduce。通过分析这些组件的工作机制,帮助读者更好地理解Hadoop的架构及其在大数据处理中的应用。 ... [详细]
  • 深入解析BookKeeper的设计与应用场景
    本文介绍了由Yahoo在2009年开发并于2011年开源的BookKeeper技术。BookKeeper是一种高效且可靠的日志流存储解决方案,广泛应用于需要高性能和强数据持久性的场景。 ... [详细]
  • 智慧城市建设现状及未来趋势
    随着新基建政策的推进及‘十四五’规划的实施,我国正步入以5G、人工智能等先进技术引领的智慧经济新时代。规划强调加速数字化转型,促进数字政府建设,新基建政策亦倡导城市基础设施的全面数字化。本文探讨了智慧城市的发展背景、全球及国内进展、市场规模、架构设计,以及百度、阿里、腾讯、华为等领军企业在该领域的布局策略。 ... [详细]
  • 如何使用Ping命令来测试网络连接?当网卡安装和有关参数配置完成后,可以使用ping命令来测试一下网络是否连接成功。以winXP为例1、打开XP下DOS窗口具体操作是点击“开始”菜 ... [详细]
  • Python 工具推荐 | PyHubWeekly 第二十一期:提升命令行体验的五大工具
    本期 PyHubWeekly 为大家精选了 GitHub 上五个优秀的 Python 工具,涵盖金融数据可视化、终端美化、国际化支持、图像增强和远程 Shell 环境配置。欢迎关注并参与项目。 ... [详细]
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
  • 本文详细介绍了C语言中的基本数据类型,包括整型、浮点型、字符型及其各自的子类型,并探讨了这些类型在不同编译环境下的表现。 ... [详细]
  • 前言无论是对于刚入行工作还是已经工作几年的java开发者来说,面试求职始终是你需要直面的一件事情。首先梳理自己的知识体系,针对性准备,会有事半功倍的效果。我们往往会把重点放在技术上 ... [详细]
  • 本文探讨了大型服务端开发过程中常见的几个误区,包括异步任务处理不当、日志同步模式使用、网络操作未设置超时、缓存命中率及响应时间未统计、单一缓存模式、分布式缓存加锁不当以及团队管理上的误区,旨在帮助开发者避免这些常见错误。 ... [详细]
  • 三星Galaxy S8/S8+即将登场,全面解析新旗舰
    3月29日晚11点,备受瞩目的三星Galaxy S8/S8+将正式发布。作为三星在Note 7爆炸事件后的重磅产品,S8/S8+不仅承载着恢复消费者信心的重任,其创新的设计和技术也备受期待。 ... [详细]
author-avatar
幸运的anan本人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有