数据结构之设计

简介: 数据结构之设计

☺ 数据结构之设计☺


 

1,动态数组的设计


0.png2,链表的设计


1.png


(结点Node模型 也设计成一个类,因为它只在 链表内部使用,所以它是链表类的内部类)


2.png



3,双向链表的设计:(链表模式中 first 指向了 头结点, last 指向了尾结点)

好处:当要找的index 大于 size 的一半(size >> 1),last指针开始从后到前寻找

   当要找的index 小于 size 的一半 (size >> 1),first指针开始从前到后寻找


3.png


4,对于接口的完美利用:

1,遇到局限情况:

二叉树的遍历:“被写死”:只能打印出该结点:

System.out.println(node.elmement);


4.png


2,设计改善:

传入一个接口变量的参数该接口定义了一个方法(该方法有一个参数是结点参数)

因为是接口,则外界使用到它时,便需要实现它的方法,而它的方法就含有结点参数


5.png

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

6.png


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

7.png


3,设计增强:(层序遍历)

增强遍历:通过接口方法的返回值,控制遍历的停止(so 接口方法需要写成可以被控制的,例如布尔类型


8.png


 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


9.png

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

10.png


3-2,设计增强:(前序遍历/中序遍历/后序遍历)

区别:前序遍历/中序遍历/后序遍历 与 层序遍历的最大区别是:前者使用了递归,后者就是普通的迭代。

应对差异的区别:层序遍历可以直接止步于当前,而使用了递归的前序遍历/中序遍历/后序遍历的止步需要看前一步的结果,so 需要有一个变量记录。

 

如果是前序定义一个记录变量,中序定义一个记录变量,后序定义一个记录变量的话,定义的变量有点多(第一个缺点),

而且定义的变量必须是全局变量(但是使用多线程的话,造成线程不安全~第二个缺点)

发现了接口对象vistitor 是具有全局的特点(因为自从外界传入之后,使用的vistitor 便是同一个,

我们希望往visitor 对象中添加属性,但是vistior是接口,so 修改成灵活的抽象类)


11.png


 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


12.png


 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


13.png


5,对于已知类的功能的扩展:

☺组合关系:在已知类内部定义一个属性对象

☺继承关系:让已知类对某个接口或者抽象类(或者是普通父类)进行继承

强制类型转化:将原对象转换成接口对象/抽象类(或者普通父类)对象,便可以使用转化的对象的接口方法

 

● 举例子:二叉搜索树,扩展功能---------比较大小(制定一定比较规则):(这样就方便二叉搜索树另外一个接口-添加接口的实现)

组合关系

因为java.util.Comparator<T> 已经内置实现好了,不用自己再去实现这个Comparator 接口哈哈哈

可以看到:java内置的Comparator<T> 的样子:


13.png


☺组合关系的代码实现--------------------------------------------------------------------



14.png


------------------------------------------------------------------------------------------------

继承关系:

因为java.lang.Comparable<T> 已经内置实现好了,不用自己再实现该接口哈哈哈


15.png

可以看到:java 内置的Comparable<T> 的样子:


16.png


☺继承关系的代码实现:-------------------------------------------------------------------

17.png

-------------------------------------------------------------------------------------------

强制类型转化的代码实现:---------------------------------------------------------------------



18.png


----------------------------------------------------------------------------------------------------

 

6,对于已知类的功能的扩展:

自己写一个方法,但是这个方法根据它的特性,放到已知类的子类更加合适】,问题变成了父类如何引用到子类的方法

------还是定义接口(可以是接口类中的方法、或者直接是已知类的抽象方法、普通方法),让子类实现即可。

例子:BST(二叉搜索树~已知类)、继承 BST的 AVL 子类:想拥有高度平衡的功能,需要思考:什么时候需要调整高度?添加结点之后,而这个调整高度的接口方法的实现更应该写到子类AVL 中去可以先只是在父类BST类中定义一个接口方法,在子类AVL 进行重写。

✿ 补充一下:平衡因子【结点高度】~ 如果是想直接写到BT(二叉树的结点类Node 中,就会使得通用的Node 类多了一个不是通用的属性,不符合设计,需要谁需要平衡因子,就谁自己添加上它,解决:可以采用继承的方式,在AVLTree 中,进行再定义一个AVLTreeNode 特有的结点类(该类继承了BT中Node 类。))

 

目录
相关文章
|
7月前
|
存储 机器学习/深度学习 算法
数据结构-概念版(三)
数据结构-概念版
128 0
|
7月前
|
存储 算法
数据结构-概念版(四)
数据结构-概念版
103 0
|
7月前
|
存储 机器学习/深度学习 人工智能
数据结构基础(一)
数据结构是计算机科学中的一个重要概念,用于组织和存储数据以便有效地访问和修改。它是计算机科学的基础之一,几乎在所有领域都有应用,包括算法设计、数据库管理系统、编译器构建等。
43 0
 数据结构基础(一)
|
存储 前端开发 C++
C++基础篇之什么是 数据结构
C++基础篇之什么是 数据结构
|
7月前
|
存储 算法 搜索推荐
数据结构-概念版(七)
数据结构-概念版
85 0
|
7月前
|
存储 算法 Serverless
数据结构-概念版(六)
数据结构-概念版
128 0
|
7月前
|
存储 机器学习/深度学习 算法
数据结构-概念版(一)
数据结构-概念版
131 0
|
7月前
|
存储 人工智能 算法
数据结构-概念版(五)
数据结构-概念版
101 0
|
7月前
|
存储 机器学习/深度学习 算法
数据结构-概念版(二)
数据结构-概念版
63 0
|
存储 传感器 缓存
v4l2数据结构分析
v4l2数据结构分析
144 0