一 数据的基本概念
1、数据:所有能输入计算机并被识别的符号
数据元素:数据基本单位,由若干数据项组成(比如数据库里的一条数据)
数据项:最小数据单位(比如数据库里一条数据的每一列就是一个数据项)
数据对象:性质相同的数据的集合
2、计算机处理的计算问题分为两大类:数值计算、非数值计算。
数据结构研究非数值计算,是有特定关系的数据元素的集合。
数据结构四种基本类型:集合、线性、树和网(这俩也叫非线性)
3、数据结构的研究视角:
数据的逻辑结构:从逻辑关系上描述数据,独立于计算机之外
数据的存储结构:逻辑结构在计算机上的物理实现(分为顺序和链式两类)
顺序存储:把逻辑上相邻的元素存储在相邻的数据单元中,用其存储位置来表示其逻辑关系。
链式存储:逻辑上相邻的元素在存储器中不一定相邻。用附加地址表示数据元素之间的逻辑关系。
索引存储结构:在存储结点信息的同时,还建立附加的索引表,存取数据时,都必须依赖索引。
散列存储结构:是根据结点的值确定结点的存储位置。通过某个函数(散列函数)计算出其存储地址。它只存储结点的数值而不存储结点间的关系。
顺序存储结构:数组或指针指向的一片连续空间。
顺序表:线性表中逻辑上邻接的两个数据节点,其存储结点在物理位置上也是相邻的,以这种顺序存储结构实现的线性表,被称为“顺序表”。
线性表:属于同一个数据对象的数据元素的有限序列。线性表中数据元素的个数称为线性表的长度。如:(1,3,5,7,9)是个线性表,数据元素类型为整数,长度为5,其中1是3的直接前驱,5是3的直接后继。基本操作:存取、插入、删除、查找、求表长(求线性表中元素的个数)、表的合并
二叉树,我认为就是为了2分法而存在的,查找快。
哈夫曼树,唯一特点就是每个节点都是最优、唯一。
hash函数,我认为用处就是将数据的hash值与其存储地址对应,查找时不用再比较。
treeset 是二叉树(红黑树)实现的,treeset中的数据是自动排好序的,不允许放入null值,值不能重复。
hashset 是哈希表实现的,hashset中的数据是无序的,可以放入null,值不能重复。
hashset 要求放入的对象,必须实现hashcode方法,放入的对象,是以hashcode码作为标识,而具有相同内容得String对象,hashcode是一样的,所以放入的内容不能重复
适用场景分析:hashset是基于hash算法实现的,其性能通常都优于treeset。为快速查找而设计的set,应该用hashset,在需要排序时,才用treeset。
hashmap:基于哈希表实现,适用时要求添加的键类明确定义了hashcode()和equals()。
treemap:基于红黑树实现。它没有调优选项,因为该树总处于平衡状态。
适用场景分析:hashmap适用于map中插入、删除、定位元素。treemap适用于按自然顺序或自定义顺序遍历键(key)。
刚看数据结构时,还在奇怪这些原理怎么用代码实现,用起来总用代码实现这些原理,岂不是很麻烦?
后来才明白,java自己的集合框架已经帮我们实现了这些,我们根据原理,将其直接应用到不同的场景即可。
二、算法
算法:在数据的逻辑结构上,对数据施加的操作(有检索、插入、删除、更新、排序等)
1、算法:algorithm,解决特定问题的方法,它用特定的程序设计语言来描述,就成了程序。
2、算法语法:
- 预定义常量和类型:True 1 False 0
- 算法的函数描述:赋值语句,选择语句,循环语句,结束语句,输入输出语句
3、算法效率的度量
3.1时间复杂度:将算法中重复执行的次数作为其执行时间的量度。
简单来说就是指算法中某种基本操作执行次数的数量级。通常用T(n)=O(f(n)),其中O表示f(n)的数量级。它表示随着问题的规模n的增大,算法的执行时间的增长率和f(n)的增长率相同,称为算法的渐进时间复杂度,简称时间复杂度。
3.2 空间复杂度:程序运行从开始到结束所需的存储空间。度量记作S(n)=O(f(n))