点击上方
“尚学堂”
关注我们
前言:
数据结构和算法是程序员的内功心法和基本功。无论是Java还是其它计算机科学领域,掌握扎实的数据结构和算法知识,往往会助力不少!
数据结构是计算机存储、组织数据的方式,同时也泛指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的算法执行或是数据存储效率。数据结构往往同高效的算法和索引技术有很强的关联性和依赖性。
在计算机程序设计中,我们可以用数据结构来表示特定的对象数据,这些数据往往多样化的且拥有不同的数据结构,诸如数组、借口、类和枚举等等。不同的数据结构所采用的处理方法不同,计算复杂度也不同,因此,算法往往依赖于基础。难怪计算机科学家尼古拉斯沃斯(Nicklaus Wirth)提出了公式“算法+数据结构=程序”,化繁为简地展示出了计算机程序的本质。对初学者来讲,仅仅依靠观察这个公式,我们也会发现数据结构和算法一定是如影相随难分难舍的。
数据结构定义
随着计算机科学与技术的飞速发展,计算机的应用领域已不再局限于科学计算,而更多应用于控制、管理、生活和娱乐等非数值处理领域。与此相应,计算机程序处理的数据也由纯粹的数值扩充到字符、表格、图形、图表、图像、声音、位置等等,且数据量也越来越大,数据处理频次也越来越高。
由此可见,数据结构起源于计算机程序设计,并随之发展而发展,它们互为伴生物。虽然当下各种计算机以及程序已是家喻户晓触手可用,但遗憾的是,迄今为止,数据结构在业界还没有一个统一的定义,不同的专家,对数据结构有不同的阐述。但根据不同专家的阐述,重点关注如下:数据的逻辑结构,数据的物理存储,数据的运算。
另外,数据结构不但是一切算法的基础,而且还是程序设计语言的基础。诸如Java,C++,C,C#,Python等等,其语言特性都是建立在一定的数据结构之上。因此,深入学习数据结构,也是掌握语言特性并能够高效解决实际程序设计问题的正确开始。
数据结构的基本概念
数据(Data)
数据元素(Data Element)
数据结构(Data Structure)
数据结构的内容
数据的逻辑结构
数据的存储结构
数据的运算
数据结构的分类
线性结构
数组、队列、链表、栈
非线性结构
树、图、堆、散列表
数据结构的存储方式
顺序存储方式
链接存储方式
索引存储方式
散列存储方式
线性表、顺序表和链表介绍
线性表
线性表(list):零个或多个数据元素的有限序列。
所谓的线性表,就是将数据排成像一条长线一样的结构,数组,链表,栈,队列都是线性表结构,线性表上的每个数据最多只有前后两个方向,下面以一幅图的形式来展现一下线性表结构
与这种线性结构对应的就是非线性结构,比如后续要学习的数,堆,图等,在这些非线性数据结构中,数据之间并不是简单的前后关系,如下图:
线性表:逻辑结构, 就是对外暴露数据之间的关系,不关心底层如何实现。
顺序表、链表:物理结构,他是实现一个结构实际物理地址上的结构。比如顺序表就是用数组实现。而链表用指针完成主要工作。不同的结构在不同的场景有不同的区别。
对于java来说,大家都知道List接口类型,这就是逻辑结构,因为他就是封装了一个线性关系的一系列方法和数据。而具体的实现其实就是跟物理结构相关的内容。比如顺序表的内容存储使用数组的,然后一个get,set,add方法都要基于数组来完成,而链表是基于指针的。当我们考虑对象中的数据关系就要考虑指针的属性。指针的指向和value。
线性表、顺序表和链表之间的区别和联系
线性表基本架构
对于一个线性表来说。不管它的具体实现方法如何,我们应该有的函数名称和实现效果应该一致。你也可以感觉的到在一些结构的设计。比如List的Arraylist和LinkedList。Map的HashMap和currentHashMap他们的接口api都是相同的,但是底层设计实现肯定是有区别的。
所以,基于面向对象的编程思维,我们可以将线性表写成一个接口,而具体实现的顺序表和链表可以继承这个接口的方法,提高程序的可读性。
还有一点比较重要的,记得初学数据结构与算法时候实现的线性表都是固定类型(int),随着知识的进步,我们应当采用泛型来实现更合理。至于接口的具体设计如下:
package LinerList;
public interface ListInterface {
void Init(int initsize);//初始化表
int length();
boolean isEmpty();//是否为空
int ElemIndex(T t);//找到编号
T getElem(int index) throws Exception;//根据index获取数据
void add(int index,T t) throws Exception;//根据index插入数据
void delete(int index) throws Exception;
void add(T t) throws Exception;//尾部插入
void set(int index,T t) throws Exception;
String toString();//转成String输出
}
百战程序员 数据结构和算法
课程新升级!
新内容为《Java全系列》第二十九阶段:数据结构和算法,涵盖全套线性表的理论知识与实践,系统化学习,面试、实践不惧怕!
第1章_绪论
01_绪论_知识体系介绍
02_绪论_数据结构概述
03_绪论_数据的逻辑结构
04_绪论_数据的物理结构
05_绪论_什么是算法
06_绪论_时间复杂度的计算
07_绪论_常见时间复杂度介绍
08_绪论_最好、最坏和平均时间复杂度
09_绪论_算法的空间复杂度
第2章_线性表
10_线性表_线性表的概述
11_线性表_顺序表的特点
12_线性表_模拟ArrayList的实现_添加和获取操作
13_线性表_模拟ArrayList的实现_插入和删除操作
14_线性表_数组的反转_实现方案一
15_线性表_数组的反转_实现方案二
16_线性表_找数组中重复的元素
17_线性表_使奇数位于偶数前面
18_线性表_单链表的概述
19_线性表_顺序表和单链表的比较
20_线性表_模拟SingleLinkedList实现_添加和获取操作
21_线性表_模拟SingleLinkedList实现_删除操作
22_线性表_模拟SingleLinkedList实现_插入操作
23_线性表_双链表的概述
24_线性表_模拟DoubleLinkedList实现_添加和获取操作
25_线性表_模拟DoubleLinkedList实现_删除操作
26_线性表_模拟DoubleLinkedList实现_插入操作 - Join
27_线性表_环形链表的概述
28_线性表_模拟CycleSingleLinkedList实现_添加和获取操作
29_线性表_模拟CycleSingleLinkedList实现_删除和插入操作
30_线性表_环形单链表的约瑟夫问题_思路分析
31_线性表_环形单链表的约瑟夫问题_代码实现
32_线性表_单链表的反转_思路分析
33_线性表_单链表的反转_代码实现
完整Java课程大纲
只为想进步的你