数据结构一

//===================================================//
//                                //
//              基本概念               //
//                                //
//===================================================//
一. 进阶高手的大门
(1)理解程序的本质
程序是为了实际的问题而存在的,从本质上而言,程序是解决问题的步骤描述。
(实际问题==>深入分析问题==>解决问题的步骤==>将解决步骤翻译成程序)
首先理解实际问题:
1.确认问题类型,如:数值计算,求最小值个数
2.确认求解的步骤
解决方案的对比:
1.用尽量少的内存空间解决问题
2.用尽量少的解决问题的步骤

二. 数据的艺术
(1)数据结构起源
计算机从解决数值计算问题到解决生活中的问题
现实生活中的问题涉及不同个体间的复杂联系
需要在计算机程序中描述生活中个体间的联系

数据结构主要研究非数值计算程序问题中的操作对象以及它们之间的关系。

数据:程序的操作对象,用于描述客观事物。
数据特点:可以输入到计算机;可以被计算机程序处理。
数据元素:组成数据的基本单位
数据项:一个数据元素由若干数据项组成
数据对象:性质相同的数据元素的集合

数据元素:
数据元素之间不是独立的,存在特定的关系,这些关系就是结构。
数据结构指数据对象中数据元素之间的关系。
(2)逻辑结构
1.集合结构
数据元素之间没有特别的关系,仅属于相同集合。
2.线性结构
数据元素之间是一对一的关系。
3.树形结构
数据元素之间存在一对多的层次关系。
4.图形结构
数据元素之间是多对多的关系。
(3)物理结构
逻辑结构在计算机中的存储形式。
1. 顺序存储结构
将数据存储在地址连续的存储单元里。
2. 链式存储结构
将数据存储在任意的存储单元里,通过保存地址的方式找到相关联的数据元素。

三. 程序的灵魂--算法
(1)数据结构与算法
数据结构只是静态的描述了数据元素之间的关系
高效的程序需要在数据结构的基础上设计和选择算法。

高效的程序 = 恰当的数据结构 + 合适的算法

(2)算法的定义
算法是特定问题求解步骤的描述,在计算机中表现为指令的有限序列

算法是独立存在的一种解决问题的方法和思想。
对于算法而言,语言并不重要,重要的是思想。

算法的特性:
1.输入 算法具有0个或者多个输出
2.输出 算法至少有1个或者多个输出
3.有穷性 算法在有限的步骤之后会自动结束而不会无限循环
4.确定性 算法中的每一步都有确定的含义,不会出现二义性
5.可行性 算法的每一步都是可行的

算法设计的准则:
1.正确性
算法对于合法数据能够得到满足要求的结果
算法能够处理非法输入,并得到合理的结果
算法对于边界数据和压力数据都能得到满足要求的结果
(注:正确性是算法最需要满足的基本的准则,但是作为计算机程序,不可能无限制的满足这条准则。)
2.可读性 算法要方便阅读、理解、交流 (决不可忽视)
3.健壮性 算法不应该产生莫名其妙的结果
4.高性价比 利用最少的时间和资源得到满足要求的结果

四. 审判程序的而灵魂
(1)算法效率的度量
1.事后统计法
比较不同的算发对同一组输入数据的运行处理时间

缺陷:
为了获得不同算法的运行时间必须编写相应程序
运行时间严重依赖硬件以及运行时的环境因素
算法的测试数据的选取相当困难
2.事前分析估算法
依据统计的方法对算法效率进行估算
影响算法效率的额主要因素:
算法采用的策略和方法
问题的输入规模
编译器所产生的代码
计算机执行的速度
3.大O表示法
算法效率严重依赖与操作数量
在判断时首先关注操作数量的最高次项
操作数量的估算可以作为时间复杂度的估算
O(5)=O(1) 常数阶
O(2n+1)=O(n) 线性阶
O(n^2+n+1)=O(n^2) 平方阶
O(3n^3+1)=O(n^3) 立方阶
关系:
O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)

时间复杂度:在没有特殊说明时,我们分析的算法时间复杂度都是指最坏时间复杂度。
空间复杂度:算法的空间复杂度通过计算算法的存储空间实现
S(n) = O(f(n))
其中,n为问题规模,f(n)为在问题规模为n时多占用存储空间的函数。
大O表示法同样适用于空间复杂度。
(2)空间与时间的策略
多数情况下,算法执行时所使用的时间更令人关注
如果有必要,可以通过增加空间复杂度来降低时间复杂度
同理,也可以通过增加石家复杂度来降低空间复杂度

时间: 2024-10-16 05:28:39

数据结构一的相关文章

【数据结构】之散列链表(Java语言描述)

散列链表,在JDK中的API实现是 HashMap 类. 为什么HashMap被称为"散列链表"?这与HashMap的内部存储结构有关.下面将根据源码进行分析. 首先要说的是,HashMap中维护着的是一个数组: transient Node<K,V>[] table; ,数组中的每个元素都是一个 Node 对象.这里的Node是HashMap的一个内部类,代码如下: static class Node<K,V> implements Map.Entry<

旧题新做:从idy的视角看数据结构

“今天你不写总结……!!!” 额…… 还是讲我的吧.这些考试都是idy出的题. 20170121:DFS序. ST表.线段树练习 这是第一次考数据结构. Problem 1. setsum 1 second 给你一个长度为N 的整数序列,支持两种操作: • modity l r val 将区间[l,r] 中的所有数修改为val • query l r 询问区间[l,r] 所有数的和 分析:最简单的线段树,区间更改区间求和.但注意是更改,不是添改,sum与flag需同时覆盖. Problem 2.

数据结构Set和Map

一.数据结构 Set 集合的基本概念:集合是由一组无序且唯一(即不能重复)的项组成的.这个数据结构使用了与有限集合相同的数学概念,应用在计算机的数据结构中.  特点:key 和 value 相同,没有重复的 value.ES6 提供了数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. 1. 如何创建一个 Set const s = new Set([1, 2, 3]); 2.属性 console.log(s.size); // 3 3.Set 类的方法 --set.add(v

数据结构基本概念

什么是数据结构 "数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系.这些联系可以通过定义相关的函数来给出"--Sartaj Sahni,<数据结构.算法与应用> "数据结构是ADT(抽象数据类型Abstract Data Type)的物理实现."--Clifford A.Shaffer,<数据结构与算法分析> "数据结构(data structture)是计算机中存储.组织数据的方式.通常情况下,经i想你

分布式缓存技术redis学习系列(二)——详细讲解redis数据结构(内存模型)以及常用命令

Redis数据类型 与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多,常用的数据类型主要有五种:String.List.Hash.Set和Sorted Set. Redis数据类型内存结构分析 Redis内部使用一个redisObject对象来表示所有的key和value.redisObject主要的信息包括数据类型(type).编码方式(encoding).数据指针(ptr).虚拟内存(vm)等.type代表一个value对象具体是何种数

【Python&amp;数据结构】 抽象数据类型 Python类机制和异常

这篇是<数据结构与算法Python语言描述>的笔记,但是大头在Python类机制和面向对象编程的说明上面.我也不知道该放什么分类了..总之之前也没怎么认真接触过基于类而不是独立函数的Python编程,借着本次机会仔细学习一下. 抽象数据类型 最开始的计算机语言,关注的都是如何更加有效率地计算,可以说其目的是计算层面的抽象.然而随着这个行业的不断发展,计算机不仅仅用于计算,开发也不仅只关注计算过程了,数据层面的抽象也变得同样重要.虽然计算机语言一开始就有对数据的抽象,但是那些都只是对一些最基本的

深入浅出分析MySQL索引设计背后的数据结构

在我们公司的DB规范中,明确规定: 1.建表语句必须明确指定主键 2.无特殊情况,主键必须单调递增 对于这项规定,很多研发小伙伴不理解.本文就来深入简出地分析MySQL索引设计背后的数据结构和算法,从而可以帮你释疑如下问题: 1.为什么innodb表需要主键? 2.为什么建议innodb表主键是单调递增? 3.为什么不建议innodb表主键设置过长? B-tree(多路搜索树,并不是二叉的)是一种常见的数据结构.使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度.B通常

数据类型和常用数据结构

1.数据类型 几乎是所有的程序设计语言都会讲到数据类型的概念.简单的说,数据类型就是一个值的集合及在这些值上定义的一系列操作的总称.例如:对于C语言的整数类型,其有一定的取值范围,对于整数类型还定义了加法.减法.乘法.除法和取模运算等操作. 按照数据类型的值是否可以分解,数据类型可以分为基本数据类型和聚合数据类型. *基本数据类型:其值不能进一步分解,一般是程序设计语言自身定义的一些数据类型,例如C语言中.字符型.浮点型等. *聚合数据类型:其值可以进一步分解为若干分量,一般是用户自定义的数据类

第3章 文件I/O(3)_内核数据结构、原子操作

3. 文件I/O的内核数据结构 (1) 内核数据结构表 数据结构 主要成员 文件描述符表 ①文件描述符标志 ②文件表项指针 文件表项 ①文件状态标志(读.写.追加.同步和非阻塞等状态标志) ②当前文件偏移量 ③i节点表项指针 ④引用计数器 i节点 ①文件类型和对该文件的操作函数指针 ②当前文件长度 ③文件所有者 ④文件所在设备.文件访问权限 ⑤指向文件数据在磁盘块上所在位置的指针等. (2)3张表的关系 4. 文件的原子操作 (1)文件追加 ①打开文件时使用O_APPEND标志,进程对文件偏移量

数据结构与算法C++描述学习笔记1、辗转相除——欧几里得算法

前面学了一个星期的C++,以前阅读C++代码有些困难,现在好一些了.做了一些NOI的题目,这也是一个长期的目标中的一环.做到动态规划的相关题目时发现很多问题思考不通透,所以开始系统学习.学习的第一本是<数据结构与算法C++描述>第三版,边学边做一些笔记.所以这些笔记中的代码有很多将会非常简单,甚至可能只有一个记录或者结论. 辗转相除法用来求两个整数的最大公约数,即能同时整除两个数的最大整数.程序如下: int gdc(int m,int n){ int rem; while(n!=0){ //