zoukankan      html  css  js  c++  java
  • 数据结构之设计

    ☺ 数据结构之设计☺

    1,动态数组的设计

    2,链表的设计

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

     

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

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

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

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

    1,遇到局限情况:

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

    System.out.println(node.elmement);

    2,设计改善:

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

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

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

     

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

     

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

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

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

     

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

     

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

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

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

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

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

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

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

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

     

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

     

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

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

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

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

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

    组合关系

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

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

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

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

    继承关系:

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

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

     

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

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

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

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

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

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

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

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

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

     

     

     
     
  • 相关阅读:
    enote笔记语言(3)(ver0.4)
    enote笔记语言(3)(ver0.3)
    enote笔记语言(2)(ver0.5)
    enote笔记法的思考
    【原创精品】程序员最强大的利器——电子笔记本的思考(1)(ver0.3)
    enote笔记法(2)——why的使用
    enote笔记语言(5)——其他(ver0.2)
    enote笔记语言(2)(ver0.4)
    电子笔记本的思考(1)(ver0.2)
    APP——自动化——python——app测试概念和工具——背诵总结
  • 原文地址:https://www.cnblogs.com/shan333/p/15378281.html
Copyright © 2011-2022 走看看