java 数据结构_数据结构与算法——阿里Java架构师必备的软实力

 

点击上方

“尚学堂”

关注我们

前言:

数据结构和算法是程序员的内功心法和基本功。无论是Java还是其它计算机科学领域,掌握扎实的数据结构和算法知识,往往会助力不少!

1a5732398c5db713323822dfbca19397.png

数据结构是计算机存储、组织数据的方式,同时也泛指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的算法执行或是数据存储效率。数据结构往往同高效的算法和索引技术有很强的关联性和依赖性。

在计算机程序设计中,我们可以用数据结构来表示特定的对象数据,这些数据往往多样化的且拥有不同的数据结构,诸如数组、借口、类和枚举等等。不同的数据结构所采用的处理方法不同,计算复杂度也不同,因此,算法往往依赖于基础。难怪计算机科学家尼古拉斯沃斯(Nicklaus Wirth)提出了公式“算法+数据结构=程序”,化繁为简地展示出了计算机程序的本质。对初学者来讲,仅仅依靠观察这个公式,我们也会发现数据结构算法一定是如影相随难分难舍的。

数据结构定义

随着计算机科学与技术的飞速发展,计算机的应用领域已不再局限于科学计算,而更多应用于控制、管理、生活和娱乐等非数值处理领域。与此相应,计算机程序处理的数据也由纯粹的数值扩充到字符、表格、图形、图表、图像、声音、位置等等,且数据量也越来越大,数据处理频次也越来越高。

由此可见,数据结构起源于计算机程序设计,并随之发展而发展,它们互为伴生物。虽然当下各种计算机以及程序已是家喻户晓触手可用,但遗憾的是,迄今为止,数据结构在业界还没有一个统一的定义,不同的专家,对数据结构有不同的阐述。但根据不同专家的阐述,重点关注如下:数据的逻辑结构,数据的物理存储,数据的运算。

另外,数据结构不但是一切算法的基础,而且还是程序设计语言的基础。诸如Java,C++,C,C#,Python等等,其语言特性都是建立在一定的数据结构之上。因此,深入学习数据结构,也是掌握语言特性并能够高效解决实际程序设计问题的正确开始。

数据结构的基本概念

  • 数据(Data)

  • 数据元素(Data Element)

  • 数据结构(Data Structure)

数据结构的内容

  • 数据的逻辑结构

  • 数据的存储结构

  • 数据的运算

数据结构的分类

  • 线性结构

    数组、队列、链表、栈

  • 非线性结构

       树、图、堆、散列表

数据结构的存储方式

  • 顺序存储方式

  • 链接存储方式

  • 索引存储方式

  • 散列存储方式

线性表、顺序表和链表介绍

线性表

线性表(list):零个或多个数据元素的有限序列。

所谓的线性表,就是将数据排成像一条长线一样的结构,数组,链表,栈,队列都是线性表结构,线性表上的每个数据最多只有前后两个方向,下面以一幅图的形式来展现一下线性表结构

734aee8833df53e37355a9e88cee1030.png

与这种线性结构对应的就是非线性结构,比如后续要学习的数,堆,图等,在这些非线性数据结构中,数据之间并不是简单的前后关系,如下图:

bfeb988dc1be986a2377ffb354105e61.png

  • 线性表:逻辑结构, 就是对外暴露数据之间的关系,不关心底层如何实现。

  • 顺序表、链表:物理结构,他是实现一个结构实际物理地址上的结构。比如顺序表就是用数组实现。而链表用指针完成主要工作。不同的结构在不同的场景有不同的区别。

  • 对于java来说,大家都知道List接口类型,这就是逻辑结构,因为他就是封装了一个线性关系的一系列方法和数据。而具体的实现其实就是跟物理结构相关的内容。比如顺序表的内容存储使用数组的,然后一个get,set,add方法都要基于数组来完成,而链表是基于指针的。当我们考虑对象中的数据关系就要考虑指针的属性。指针的指向和value。

线性表、顺序表和链表之间的区别和联系

70a1beb39df4ea1a01b2e5fcd37b5c4a.png

线性表基本架构

  • 对于一个线性表来说。不管它的具体实现方法如何,我们应该有的函数名称和实现效果应该一致。你也可以感觉的到在一些结构的设计。比如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全系列》第二十九阶段:数据结构和算法,涵盖全套线性表的理论知识与实践,系统化学习,面试、实践不惧怕!

5686c4bdfd66540fe4077ab2629b5956.png

第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课程大纲

只为想进步的你

ae3a3d126704b52de929980411e92bce.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值