玩转数据结构 java描述 一 概况

第一章 介绍,
数据结构是计算机专业的同学必学的课程

数据结构研究的是数据如何在计算机进行组织和存储,使得我们可以高效的获取数据或者修改数据。

数据结构可以分为三种结构:

线性结构:数组;栈;队列;链表;哈希表

树结构:二叉树,二分搜索树,AVL,红黑树,Treap,Splay,堆,Trie,线段树,K-D树,并查集,哈夫曼树

图结构 邻接矩阵,邻接表

我们需要根据应用的不同,灵活选择最合适的数据结构,

例子:

1,数据库,

它已经封装好了,使用SQL语言就可以使用数据库,

SELECT * FROM 慕课网

WHERE interest = "数据结构"

里面最重要的是使用树结构:AVL,红黑树,Treap,伸展树,B树,

还有很重要的哈希表

2,操作系统

涉及非常多的数据结构,1个例子,多任务切换,涉及:

系统栈,递归调用就需要系统栈

优先队列:堆。 有了优先队列,操作系统才可以快速在多个任务之间比较他们的优先级,实现任务的切换

3,文件压缩

不只是RAR,计算机中的PNG,MP3,PDF都是对不同的文件进行了一定的压缩处理,

最基础的压缩算法使用的是哈夫曼树,

哈夫曼树很简单,现在软件已经不用了

4,通讯录,

当时使用的链表,但是联系人非常多时,查找特别慢,

最后这个问题被实习生解决,方法很简单,

Trie,前缀树。

这样,在通讯录查找任何人都是ms级别,不管你有多少联系人

大量的算法,以数据结构为基石

如,游戏中的寻路算法,是图论算法,

DFS深度优先遍历:使用栈,

BFS广度优先遍历:使用队列

数据结构+算法 = 程序

课程设置

不需要任何数据结构基础,但是需要java语言的基础,

选择java是因为java的推广度高,大多数同学都会,

java是完全面向对象的,非常适合进行底层数据结构的研究,

链表,队列,栈,哈希表,都是一个名词,然后对名词赋予不同的操作,这非常符合面向对象的原则。

所以不仅可以掌握数据结构,还可以对面向对象的设计有更深入的理解,

C++ PHP swift Python,都支持面向对象,都可以自己去写

课程包含:

数组,栈,队列,链表,

二分搜索树,堆,线段树,Trie

并查集,AVL,红黑树,哈希表,

不包含图结构,因为存储图非常简单,线性表就可以,

但是图论领域非常庞大,以算法为主,

基础的结构,也不能忽视,如:

递归,如何调试,复杂度分析,

手把手的学习底层的实现,完成后可以向更加复杂的数据结构进军,

并不是实现了就结束了,对于每个数据结构背后的思考,为什么有他们,如何优化,比较,

三个层次:
1,面向面试:

数组,栈,队列,链表,二分搜索树,堆,

最简单,是面试笔试的常客,要达到手写代码的程序,

2,面向竞赛:

线段树,Trie,并查集,

这是竞赛的常客

讲一些LeetCode典型,

最后,AVL,红黑树,哈希表,

AVL和红黑树本身都是平衡二叉树的实现,

哈希表是非常常用的数据存储结构

放在最后是因为他们比较复杂,代码量大一些

面试时不要求实现他们,都是概念和性能分析上的问题,

如红黑树书平衡的但是不是完全平衡的,所以有很多和性能分析相关的问题,

哈希表和冲突检测相关就有很多性能分析问题

本课程会从基层开始写, 一般很难这样讲

===================

1-2 ,学习数据结构有没有用?

为什么在工作中用不到数据结构和算法?

工作中用不到数据结构和算法,所以他们没用?

考硕士博士一定要数据结构和算法,所以他们只是为了应付面试和考试?

没用:

现代软件开发过程越来越简单,如IOS开发者,使用IOS,使用Swift语言,使用Xcode开发工具,

IOS开发者对他们的细节一无所知,使用接口就可以了,

不需要任何数据结构算法知识,就能开发一个很好的APP,

所以开发APP的门槛越来越低,苹果也希望这样,

所以如果只是使用工具构建出属于我们自己的网站或者APP,是越来越简单的,在技术上,

可能以后,这部分工作都不需要计算机专业的同学来做,

计算机专业的同学,关注的是上面的加粗,里面包含更多的智力劳动,

底层操作系统,数据库,语言,开发环境,各种框架,

开发他们会使用大量的框架,

这些都是大公司做的,所以

越大的公司,越需要同学有扎实的数据结构和算法功底

随着产品庞大,功能变多,开发者不仅要解决功能需求问题,还要解决计算机科学的问题,这是数据结构和算法就发挥巨大作用

学好数据结构,会大大提高技术上限,可以走的更远,

如果你想在计算机技术走的更远,就必须学习数据结构,

=====================

1-3
这门玩转数据结构,与那个166的有什么区别?

区别很大,这门课程,是以数据结构为主线的,这节课将的数据结构和那个课几乎是不重叠的,

而且重复的点,讲解也有所不同,

166的课涉及各种排序,快速排序,堆排序,图算法,

166的课用C++讲解,虽然也提供了完整的java代码,

但是我意识到很多同学都用的是java,所以用完全面向对象的java更好,

关于脚本语言:JS,Python,

这种非编译型的语言,依靠解析器在运行时进行解释的语言

脚本语言可以用来学习数据结构的原理,但不适合 考察数据结构和算法的性能,

性能不仅仅和逻辑相关,还非常依赖于其解析器对不同写法的解析的不同,

如,对于python,写出pythonic的写法可能比逻辑本身更重要,

如:

//类java的写法:

arr = []

for i in range(10):

arr.append(i)

python中 可以用生成表达式:

arr = [i for i in range(10)]

但是两种写法不仅是代码数量的区别,下面的写法性能远远优于上面的写法

所以对于脚本语言,不仅关注逻辑,还关注语法,

所以对于学习,不希望两者都关注,

像C++ java是更好的学习数据结构的语言,

java运行在JVM上,可能也涉及一些这个问题,但可以忽略

leetcode题库分门别类解析课程,就有这个问题,python跑就超时了,java/c++是通过的,

数据结构只是面试的一部分,甚至只是算法面试的一部分,

如排序算法,二分搜索算法,回溯算法,贪心算法,这个可以看玩转算法面试,

但是那些课不会涉及底层实现,如哈希表就拿来直接用,

算法竞赛非常广泛,深度也高,

图论,计算几何,组合数学,概率论,等进行考察

========

1-4
java 8,是最稳定版本

现在已经退出了java 10,由于java 8是普遍使用的,所以建议用它,

课程代码本身对java语言版本没有太多要求,用不上太多java的新特性,java 6以后都没问题,

JDK用java 8

IDE用IJ,非常好用,在jetbrains, tools->IDES->IntelliJ IDEA

喜欢这篇文章的可以给笔者点个赞同,关注一下,每天都会分享Java相关文章!还有不定时的福利赠送,包括整理的学习资料,面试题,源码等~~

原文地址:https://blog.51cto.com/14440597/2422247

时间: 2024-10-08 12:08:01

玩转数据结构 java描述 一 概况的相关文章

数据结构(Java描述)之线性表

基础概念 数据结构:是相互之间存在一种或多种关系的数据元素的集合. 逻辑结构和物理结构 关于数据结构,我们可以从逻辑结构和物理结构这两个维度去描述 逻辑结构是数据对象中数据元素之间的关系,是从逻辑意义上去描述的数据之间的组织形式. 逻辑结构有4种: 集合结构(数据元素之间仅以集合的方式体现,元素之间没有别的关系) 线性结构(数据元素之间存在一对一的关系) 树(数据元素之间为一对多或多对一的关系) 图(数据元素之间为多对多的关系) 物理结构则是逻辑结构在计算机中内存中的存储形式,分为两种: 顺序存

玩转数据结构 从入门到进阶

第1章 欢迎学习<玩转数据结构>欢迎大家学习<玩转数据结构>课程.在这个课程中,我们将从底层实现诸多数据结构,从简单,到复杂,并且探索他们的应用.在这一章,我们将来看一看数据结构的具体作用,学习数据结构的误区,学习这个课程的注意事项,和课程环境的基本搭建:) ...1-1 欢迎学习<玩转数据结构>1-2 学习数据结构(和算法)到底有没有用?1-3 关于课程学习的更多注意事项1-4 课程编程环境搭建 第2章 不要小瞧数组数组,看似是最简单的数据结构,但是,大多数语言为我们

纯数据结构Java实现(4/11)(BST)

个人感觉,BST(二叉查找树)应该是众多常见树的爸爸,而不是弟弟,尽管相比较而言,它比较简单. 二叉树基础 理论定义,代码定义,满,完全等定义 不同于线性结构,树结构用于存储的话,通常操作效率更高.就拿现在说的二叉搜索树(排序树)来说,如果每次操作之后会让剩余的数据集减少一半,这不是太美妙了么?(当然不当的运用树结构存储,也会导致从 O(logN) 退化到 O(n)). 值得说明,O(logN) 其实并不准确,准确来说应该说 O(树的高度) 定义&性质&行话 树里面常见的二叉树: BST,

数据结构Java实现05----栈:顺序栈和链式堆栈

数据结构Java实现05----栈:顺序栈和链式堆栈 一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除操作. 先进后出:堆栈中允许进行插入和删除操作的一端称为栈顶,另一端称为栈底.堆栈的插入和删除操作通常称为进栈或入栈,堆栈的删除操作通常称为出栈或退栈. 备注:栈本身就是一个线性表,所以我们之前讨论过线性表的顺序存储和链式存储,对于栈来说,同样适

数据结构Java实现06----中缀表达式转换为后缀表达式

数据结构Java实现06----中缀表达式转换为后缀表达式 本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则),如:2 1 + 3 *.又比如3+(6-4/2)*5=23的后缀表达式为:3642/-5*+# (#符号为结束符

数据结构Java实现04----循环链表、仿真链表

数据结构Java实现04----循环链表.仿真链表 单向循环链表 双向循环链表 仿真链表 一.单向循环链表: 1.概念: 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环. 和单链表相比,循环单链表的长处是从链尾到链头比较方便.当要处理的数据元素序列具有环型结构特点时,适合于采用循环单链表. 和单链表相同,循环单链表也有带头结点结构和不带头结点结构两种,带头结点的循环单链表实现插入和删除操作时,算法实现较为

数据结构Java实现03----单向链表的插入和删除

数据结构Java实现03----单向链表的插入和删除 文本主要内容: 链表结构 单链表代码实现 单链表的效率分析 一.链表结构:            概念: 链式存储结构是基于指针实现的.我们把一个数据元素和一个指针称为结点.   数据域:存数数据元素信息的域. 指针域:存储直接后继位置的域. 链式存储结构是用指针把相互直接关联的结点(即直接前驱结点或直接后继结点)链接起来.链式存储结构的线性表称为链表. 链表类型: 根据链表的构造方式的不同可以分为: 单向链表 单向循环链表 双向循环链表 二

数据结构Java实现07----队列:顺序队列&amp;顺序循环队列、链式队列、顺序优先队列

数据结构Java实现07----队列:顺序队列&顺序循环队列.链式队列.顺序优先队列 一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-

二叉树的创建和四种遍历(前序、先序、后序、层次、结点的层数、深度、叶子数等)—java描述

二叉树的创建和四种遍历(前序.先序.后序.层次.结点的层数.深度.叶子数等)—java描述 package javab; //树的结点类 public class TreeNode { String data; TreeNode leftChild,rightChild,next; public TreeNode(String data){ this.data=data; } public TreeNode(String data,TreeNode left,TreeNode right){ l