数据结构

1 线性表

1.1 顺序存储结构

1.1.1 特点

查找的性能高

1.1.2 代表

ArrayList(java),vector(java),stack(java)

1.2 链式存储结构

1.2.1 特点

插入、删除的性能高

1.2.2 分类

单项链表、双向链表、单项循环链表、双向循环链表

1.2.3 代表

LinkedList(java),Queue(java)

2 Map

3 Tree

3.1 二叉树

3.1.1 斜树

3.1.2 满二叉树

3.1.3 完全二叉树

若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

3.1.4 二叉树(视频)

package com.dn.binarytree;

import java.util.*;

public class BinaryTree {
    
    public static void main(String[] args) {
        BinaryTree binaryTree=new BinaryTree();
//      binaryTree.createBinaryTreeNor();
//      int height=binaryTree.getHeight();
//      System.out.println("treeHeight:"+height);
//      int size=binaryTree.getSize();
//      System.out.println("treeSize:"+size);
//      binaryTree.preOrder(binaryTree.root);
//      binaryTree.midOrder(binaryTree.root);
//      binaryTree.postOrder(binaryTree.root);
    
        ArrayList<String> data=new ArrayList<>();
        String[] dataArray=new String[]{"A","B","D","#","#","E","#","#","C","#","F","#","#"};
        for (String string : dataArray) {
            data.add(string);
        }
        binaryTree.createBinaryTreePre(data);
        binaryTree.preOrder(binaryTree.root);
    }

    public class TreeNode{  
        private int index;
        

        private String data;
        private TreeNode leftChild;
        private TreeNode rightChild;
    
        
        public TreeNode(int index,String data){
            this.index=index;
            this.data=data;
            this.leftChild=null;
            this.rightChild=null;
            
        }
        
        public int getIndex() {
            return index;
        }

        public void setIndex(int index) {
            this.index = index;
        }

        public String getData() {
            return data;
        }

        public void setData(String data) {
            this.data = data;
        }

    }
    
    private TreeNode root=null;
    
    public BinaryTree(){
        root=new TreeNode(1,"A");
    }
    
//构建查找二叉树
    
    
    
    
//  构建二叉树
//      A 
//    /   \
//   B      C
//  / \      \
// D   E      F 
    public void createBinaryTreeNor(){
        createBinaryTree();
    }
    public void createBinaryTree(){
        TreeNode nodeB=new TreeNode(2,"B");
        TreeNode nodeC=new TreeNode(3,"C");
        TreeNode nodeD=new TreeNode(4,"D");
        TreeNode nodeE=new TreeNode(5,"E");
        TreeNode nodeF=new TreeNode(6,"F");
        root.leftChild=nodeB;
        root.rightChild=nodeC;
        nodeB.leftChild=nodeD;
        nodeB.rightChild=nodeE;
        nodeC.rightChild=nodeF;
    }
    //求深度
    public int getHeight(){
        return getHeight(root);
    }
    
    private int getHeight(TreeNode node){
        if(node==null){
            return 0;
        }else{
            int i=getHeight(node.leftChild);
            int j=getHeight(node.rightChild);
            return (i<j)?j+1:i+1;
        }
    }
    
    //求节点总数
    public int getSize(){
        return getSize(root);
    }
    
    private int getSize(TreeNode node){
        if(node==null){
            return 0;
        }else{
            return 1+getSize(node.leftChild)+getSize(node.rightChild);
        }
    }
    
    //前序遍历-迭代
    public void preOrder(TreeNode node){
        if(node==null){
            return;
        }else{
            System.out.println("preOrder data:"+node.getData());
            preOrder(node.leftChild);
            preOrder(node.rightChild);
        }
    }
    
    //通过前序遍历的结果反向生成二叉树
//          A
//        /   \
//      B       C
//     / \     / \ 
//    D   E   #   F
//   / \  /\     / \    
//  #  # # #    #   #
//  
//  A B D # # E # # C # F # #   
    public void createBinaryTreePre(ArrayList<String> data){
        createBinaryTree(data.size(),data);
    }
    
    public TreeNode createBinaryTree(int size,ArrayList<String> data){
        if(data.size()==0){
            return null;
        }
        String d=data.get(0);
        TreeNode node;
        int index=size-data.size();
        if(d.equals("#")){
            node=null;
            data.remove(0);
            return node;
        }
        node=new TreeNode(index,d);
        if(index==0){
            root=node;
            
        }
        data.remove(0);
        node.leftChild=createBinaryTree(size,data);
        node.rightChild=createBinaryTree(size,data);
            
        
        return node;
    }
    
    
    
    //中序遍历-迭代
    public void midOrder(TreeNode node){
        if(node==null){
            return;
        }else{
            midOrder(node.leftChild);
            System.out.println("midOrder data"+node.getData());
            midOrder(node.rightChild);
        }
    }
    
    //后序遍历-迭代
    public void postOrder(TreeNode node){
        if(node==null){
            return;
        }else{
            postOrder(node.leftChild);
            postOrder(node.rightChild);
            System.out.println("preOrder data:"+node.getData());
        }
    }
}

3.1.5 查找二叉树(视频)

package com.pjw.sw;

public class SearchBinaryTree {
    private TreeNode root;
    
    public SearchBinaryTree(){
        
    }
    
    public static void main(String[] args) {
        
        SearchBinaryTree binaryTree=new SearchBinaryTree();
        int[] datas=new int[]{50,30,20,44,88,33,87,16,7,77};
        for (int i : datas) {
            binaryTree.put(i);
        }
        binaryTree.midOrder(binaryTree.root);
        binaryTree.deleteNode(16);
        System.out.println("##############");
        binaryTree.midOrder(binaryTree.root);
    }
    
    //中序遍历-迭代
    public void midOrder(TreeNode node){
        if(node==null){
            return;
        }else{
            midOrder(node.leftChild);
            System.out.println("midOrder data"+node.getData());
            midOrder(node.rightChild);
        }
    }
    
    
    //创建查找二叉树,添加节点
    public TreeNode put(int data){
        TreeNode node=null;
        TreeNode parent=null;
        
        if(root==null){
            node=new TreeNode(0,data);
            root=node;
            return node;
        }
        node=root;
        while(node!=null){
            parent=node;
            if(data>node.data){
                node=node.rightChild;
            }else if(data<node.data){
                node=node.leftChild;
            }else{
                return node;
            }
        }
        node=new TreeNode(0,data);
        if(data<parent.data){
            parent.leftChild=node;
        }else{
            parent.rightChild=node;
        }
        node.parent=parent;
        return node;
    }
    
    //删除节点
    public void deleteNode(int key){
        TreeNode node=searchNode(key);
        if(node==null){
            System.out.println("该节点无法找到");
        }else{
            delete(node);
        }
    }
    
    
    public void delete(TreeNode node) {
        if(node==null){
            System.out.println("该节点无法找到");
        }else{
            TreeNode parent=node.parent;
            //被删除的节点没有孩子
            if(node.leftChild==null&&node.rightChild==null){
                if(parent.leftChild==node){
                    parent.leftChild=null;
                }else{
                    parent.rightChild=null;
                }
                return;
            }
            
            
            //被删除的只有左儿子
            if(node.leftChild!=null&&node.rightChild==null){
                if(parent.leftChild==node){
                    parent.leftChild=node.leftChild;
                }else{
                    parent.rightChild=node.leftChild;
                }
                return;
            }
            
            
            //被删除的只有右儿子
            if(node.leftChild==null&&node.rightChild!=null){
                if(parent.leftChild==node){
                    parent.leftChild=node.rightChild;
                }else{
                    parent.rightChild=node.rightChild;
                }
                return;
            }
            
            //被删除的有左儿子和右儿子
            TreeNode next=getNextNode(node);
            delete(next);
            node.data=next.data;
            
            
            
            
        }
        
    }

    
    //找该节点的后继节点
    private TreeNode getNextNode(TreeNode node) {
        if(node==null){
            return null;
        }else{
            if(node.rightChild!=null){
                return getMinTreeNode(node.rightChild);
            }else{
                TreeNode parent=node.parent;
                while(parent!=null&&node==parent.rightChild){
                    node=parent;
                    parent=parent.parent;
                }
                return parent;
            }
        }
    }

    private TreeNode getMinTreeNode(TreeNode node) {
        if(node==null){
            return null;
        }else{
            while(node.leftChild!=null){
                node=node.leftChild;
            }
        }
        return node;
    }

    public TreeNode searchNode(int key) {
        TreeNode node=root;
        if(node==null){
            return null;
        }else{
            while(node!=null&&key!=node.data){
                if(key<node.data){
                    node=node.leftChild;
                }else{
                    node=node.rightChild; 
                }
            }
        }
        return null;
    }


    public class TreeNode{
        private int key;
        private TreeNode leftChild;
        private TreeNode rightChild;
        private TreeNode parent;
        private int data;
        public TreeNode(int key, int data) {
            super();
            this.key = key;
            this.data = data;
            this.leftChild=null;
            this.rightChild=null;
            this.parent=null;
        }
        public int getKey() {
            return key;
        }
        public void setKey(int key) {
            this.key = key;
        }
        public TreeNode getLeftChild() {
            return leftChild;
        }
        public void setLeftChild(TreeNode leftChild) {
            this.leftChild = leftChild;
        }
        public TreeNode getRightChild() {
            return rightChild;
        }
        public void setRightChild(TreeNode rightChild) {
            this.rightChild = rightChild;
        }
        public TreeNode getParent() {
            return parent;
        }
        public void setParent(TreeNode parent) {
            this.parent = parent;
        }
        public int getData() {
            return data;
        }
        public void setData(int data) {
            this.data = data;
        }
        
    }
}

3.1.6 我的二叉树

前序遍历.png

mid.png

后.png
import java.util.*;
public class MyTree {
    public static void main(String[] args) {


     

    }

    //已知节点总数,求树的层数
    public static int 求树的层数(int 节点总数){
        if(节点总数>0){
            int 临时变量=2;
            int 返回值=1;
            while(临时变量<=节点总数){
                临时变量=临时变量*2;
                返回值++;
            }
            return 返回值;
        }else{
            return -1;
        }

    }

    //已知树的层树,求树的左侧索引
    public static ArrayList<Integer> 求树的左侧索引(int 树的层树){
        ArrayList<Integer> 返回值=new ArrayList<>();
        if(树的层树>0){

            int 临时变量=0;
            for (int i = 0; i < 树的层树; i++) {
                返回值.add(临时变量);
                临时变量=临时变量*2+1;
            }

            return 返回值;
        }else{
            返回值.add(-1);
            return 返回值;
        }

    }

    //求父节点索引
    public static int 求父节点索引(int 自己的索引){
        if(自己的索引==0){
            return -1;
        }
        if(自己的索引>0){
            return (自己的索引+1)/2-1;
        }else{
            return -1;
        }

    }

    //求左儿子节点索引
    public static int 求左儿子节点索引(int 自己的索引,int 节点总数){
        if(自己的索引*2+1>节点总数-1){
            return -1;
        }else{
            return 自己的索引*2+1;
        }
    }

    //求右儿子节点索引
    public static int 求右儿子节点索引(int 自己的索引,int 节点总数){
        if(自己的索引*2+2>节点总数-1){
            return -1;
        }else{
            return 自己的索引*2+2;
        }
    }

    //返回最近的有右兄弟的祖宗
    public static int 返回最近的有右兄弟的祖宗(int 自己的索引){
        if(自己的索引==0){
            return -1;
        }
        int 临时变量=自己的索引;
        for(;;){
            临时变量=求父节点索引(临时变量);
            if(临时变量%2==1){
                return 临时变量;
            }else if(临时变量==0){
                临时变量=-1;
                return 临时变量;
            }

        }
    }

    //求最远左子孙
    public static int 求最远左子孙(int 自己的索引,int 节点总数){
        if(自己的索引*2+1>节点总数){
            return -1;
        }
        int 返回值=自己的索引;
        while(返回值*2+1<=节点总数-1){
            返回值=返回值*2+1;
        }

        return 返回值;
    }

    //求自己的右兄弟
    public static int 求自己的右兄弟(int 自己的索引,int 节点总数){
        if(自己的索引%2==0){
            return -1;
        }
        if(自己的索引+1<=节点总数-1){
            return 自己的索引+1;
        }else {
            return -1;
        }
    }

    //前序遍历二叉树
    public static LinkedList<Integer> 前序遍历二叉树(int 节点总数){
        LinkedList<Integer> 前序遍历索引=new LinkedList<>();
        int 当前索引=0;
        前序遍历索引.add(当前索引);
        for(;;){


            //有没有左儿子
            if(求左儿子节点索引(当前索引,节点总数)>0){  //有
                当前索引=求左儿子节点索引(当前索引,节点总数);
                前序遍历索引.add(当前索引);
            }else{  //没有

                //有没有右兄弟

                if(当前索引%2==1&&当前索引!=节点总数-1){        //有

                    //移动到右兄弟
                    当前索引++;
                    前序遍历索引.add(当前索引);

                    //查看它的祖宗有没有右兄弟
                    if(返回最近的有右兄弟的祖宗(当前索引)>0){ //有

                        当前索引=返回最近的有右兄弟的祖宗(当前索引)+1;
                        前序遍历索引.add(当前索引);
                    }else{  //没有

                        break;
                    }


                }else{  //没有

                    //有没有父亲
                    if(当前索引==0){    //没有
                        break;
                    }else{  //有

                        //查看它的祖宗有没有右兄弟
                        if(返回最近的有右兄弟的祖宗(当前索引)>0){ //有
                            当前索引=返回最近的有右兄弟的祖宗(当前索引)+1;

                            前序遍历索引.add(当前索引);
                        }else{  //没有

                            break;
                        }
                    }
                }

            }
        }

        return 前序遍历索引;
    }

    //中序遍历二叉树
    public static LinkedList<Integer> 中序遍历二叉树(int 节点总数) {
        LinkedList<Integer> 中序遍历索引 = new LinkedList<>();
        int 当前索引=求最远左子孙(0,节点总数);
        中序遍历索引.add(当前索引);
        a:for(;;){

            //是否有父亲
            if(求父节点索引(当前索引)>=0){    //有
                当前索引=求父节点索引(当前索引);
                中序遍历索引.add(当前索引);

                b:for(;;){
                    //有没有右儿子
                    if(求右儿子节点索引(当前索引,节点总数)>0){  //有
                        int 右儿子节点=求右儿子节点索引(当前索引,节点总数);

                        //右孩子有没有子孙
                        if(求左儿子节点索引(右儿子节点,节点总数)>0){   //有
                            当前索引=求最远左子孙(右儿子节点,节点总数);
                            中序遍历索引.add(当前索引);
                            continue a;
                        }else{  //没有
                            当前索引=右儿子节点;
                            中序遍历索引.add(当前索引);

                            //有没有最近的有右兄弟的祖宗
                            if(返回最近的有右兄弟的祖宗(当前索引)==-1){ //没有
                                break a;
                            }else{  //有
                                当前索引=求父节点索引(返回最近的有右兄弟的祖宗(当前索引));
                                中序遍历索引.add(当前索引);
                                continue b;
                            }
                        }
                    }else{  //没有

                      //自己有没有有兄弟
                        if(求自己的右兄弟(当前索引,节点总数)>0){   //有
                            continue a;
                        }else{  //没有

                            //有没有最近的有右兄弟的祖宗
                            if(返回最近的有右兄弟的祖宗(当前索引)==-1){ //没有
                                break a;
                            }else{  //有
                                当前索引=求父节点索引(返回最近的有右兄弟的祖宗(当前索引));
                                中序遍历索引.add(当前索引);
                                continue b;
                            }

                        }
                    }
                }

            }else{  //没有
                break a;
            }
        }

        return 中序遍历索引;
    }

    //后序遍历二叉树
    public static LinkedList<Integer> 后序遍历二叉树(int 节点总数) {
        LinkedList<Integer> 后序遍历索引 = new LinkedList<>();
        int 当前索引=求最远左子孙(0,节点总数);
        后序遍历索引.add(当前索引);
        for (;;){
            //有没有右兄弟?
            if(求自己的右兄弟(当前索引,节点总数)>0){   //有
                int 自己的右兄弟=求自己的右兄弟(当前索引,节点总数);

                //右兄弟有没有子孙?
                if(求左儿子节点索引(自己的右兄弟,节点总数)>0){    //有
                    当前索引=求最远左子孙(自己的右兄弟,节点总数);
                    后序遍历索引.add(当前索引);
                    continue;
                }else{  //没有
                    当前索引=自己的右兄弟;
                    后序遍历索引.add(当前索引);
                    continue;
                }

            }else{  //没有

                //有没有父亲?
                if(求父节点索引(当前索引)>=0){    //有
                    当前索引=求父节点索引(当前索引);
                    后序遍历索引.add(当前索引);
                    continue;

                }else{  //没有
                    break;
                }
            }


        }

        return 后序遍历索引;
    }
}

4 Graph

4.1

dfs.png

import java.util.*;

public class Graph {
    public static void main(String[] args) {
        Integer[] guanxi={
              //0,1,2,3,4,5,6,7,8
                0,1,5,0,0,0,0,0,0,   //0

                1,0,3,7,5,0,0,0,0,    //1

                5,3,0,0,1,7,0,0,0,    //2

                0,7,0,0,2,0,3,0,0,   //3

                0,5,1,2,0,3,6,9,0,    //4

                0,0,7,0,3,0,0,5,0,    //5

                0,0,0,3,6,0,0,2,7,    //6

                0,0,0,0,9,5,2,0,4,    //7

                0,0,0,0,0,0,7,4,0,    //8

        };
        String[] hang={"0","1","2","3","4","5","6","7","8"};
        String[] lie={"0","1","2","3","4","5","6","7","8"};
        ArrayList<String> 行=new ArrayList<>(Arrays.asList(hang));
        ArrayList<String> 列=new ArrayList<>(Arrays.asList(lie));
        ArrayList<Integer> 关系=new ArrayList<>(Arrays.asList(guanxi));



        ///////////////////////////////////////////////////////////////////////

        //HashMap<Integer,ArrayList<HashMap<String,Object>>> 图=构建图2(行,列,关系,"6");
        迪杰斯特拉(行,列,关系,"4");
    }




    public static HashMap<Integer,ArrayList<HashMap<String,Object>>> 构建图2(ArrayList<String> 行,ArrayList<String> 列,
                                                                          ArrayList<Integer> 关系,String 顶点){

        HashMap<Integer,ArrayList<HashMap<String,Object>>> 返回值=new HashMap<>();
        int 元素个数=行.size();
        //获取根节点的连接节点
        int 当前层数=1;
        if(当前层数==1){
            ArrayList<HashMap<String,Object>> 每层集合=new ArrayList<>();
            ArrayList<String> 根节点的连接节点=new ArrayList<>();
            HashMap<String,Object> 每层的每个元素=new HashMap<>();
            每层的每个元素.put("元素", 顶点);

            int 关系里的起始索引=行.size()*列.indexOf(顶点);
            int 关系里的结束索引=行.size()*(列.indexOf(顶点)+1)-1;
            for (int j =关系里的起始索引; j <=关系里的结束索引 ; j++) {
                if(关系.get(j)!=0){
                    根节点的连接节点.add(行.get(j%元素个数));
                }
            }
            每层的每个元素.put("儿子",根节点的连接节点);
            每层集合.add(每层的每个元素);
            返回值.put(当前层数,每层集合 );
        }
        //第一层结束,进入下一层


        当前层数++;


        for(;;){

            //上一层是否有儿子?
            HashMap<String,ArrayList<String>> 上一层的儿子集合=new HashMap<>();

            for (HashMap<String,Object> 每层的每个元素 : 返回值.get(当前层数-1)) {
                for (String 每个儿子 : (ArrayList<String>)每层的每个元素.get("儿子")) {

                    //上一层的儿子集合里有没有每个儿子?
                    if(上一层的儿子集合.get(每个儿子)==null){   //没有

                        ArrayList<String> 临时数组=new ArrayList<>();
                        临时数组.add((String)每层的每个元素.get("元素"));
                        上一层的儿子集合.put(每个儿子,临时数组);
                    }else{  //有

                        上一层的儿子集合.get(每个儿子).add((String)每层的每个元素.get("元素"));
                    }


                }
            }



            if(上一层的儿子集合.size()==0){ //上一层没有儿子
                break;
            }else{  //上一层有儿子
                Set<String> 上一层的儿子集合所有键=上一层的儿子集合.keySet();

                ArrayList<HashMap<String,Object>> 每层集合=new ArrayList<>();
                for (String 上一层的每个儿子 : 上一层的儿子集合所有键) {
                    HashMap<String,Object> 每层的每个元素=new HashMap<>();
                    ArrayList<String> 兄弟=new ArrayList<>();
                    ArrayList<String> 儿子=new ArrayList<>();
                    每层的每个元素.put("元素",上一层的每个儿子);
                    每层的每个元素.put("父亲",上一层的儿子集合.get(上一层的每个儿子));
                    int 关系里的起始索引=元素个数*列.indexOf(上一层的每个儿子);
                    int 关系里的结束索引=元素个数*(列.indexOf(上一层的每个儿子)+1)-1;

                    for (int j =关系里的起始索引; j <=关系里的结束索引 ; j++) {

                        if(关系.get(j)!=0){
                            //System.out.println(行.get(j%元素个数));
                            if(上一层的儿子集合.get(上一层的每个儿子).contains(行.get(j%元素个数))){ //是父亲

                            }else if(上一层的儿子集合所有键.contains(行.get(j%元素个数))){  //是兄弟
                                兄弟.add(行.get(j%元素个数));
                            }else{  //是儿子
                                儿子.add(行.get(j%元素个数));
                            }

                        }
                    }
                    每层的每个元素.put("本层所有元素",上一层的儿子集合所有键);
                    每层的每个元素.put("儿子",儿子);
                    每层的每个元素.put("兄弟",兄弟);
                    每层集合.add(每层的每个元素);


                }
                返回值.put(当前层数,每层集合);
                当前层数++;
            }


        }


        return 返回值;
    }


    public static void 深度优先搜索(HashMap<Integer,ArrayList<HashMap<String,Object>>> 图){

        ArrayList<String> 返回值=new ArrayList<>();

        int 当前层数=1;
        String 根节点=(String)图.get(当前层数).get(0).get("元素");
        String 临时变量=根节点;
        返回值.add(临时变量);
        b:for (;;){

            //节点是否有未被遍历过的儿子,且该儿子的父亲列表中的第一个父亲为自己?
            boolean 前进条件1=false;
            ArrayList<String> 该节点的儿子列表=new ArrayList<>();
            d:for (HashMap<String,Object> 每层的每个元素: 图.get(当前层数)) {
                if((String)每层的每个元素.get("元素")==临时变量){
                    该节点的儿子列表=(ArrayList<String>)每层的每个元素.get("儿子");
                    break d;
                }
            }
            //ArrayList<String> 该节点的儿子列表=(ArrayList<String>)图.get(当前层数).get(0).get("儿子");
//            System.out.println("当前节点:"+临时变量);
//            System.out.println("当前节点的儿子:"+该节点的儿子列表);
            a:for (String 每个儿子: 该节点的儿子列表) {
                if(!返回值.contains(每个儿子)){

                    for (HashMap<String,Object> 每层的每个元素: 图.get(当前层数+1)) {
                        if((String)每层的每个元素.get("元素")==每个儿子&&
                                ((ArrayList<String>)每层的每个元素.get("父亲")).get(0)==临时变量){
                            前进条件1=true;
                            临时变量=每个儿子;
                            break a;
                        }
                    }
                }
            }

            if(前进条件1){  //有
                返回值.add(临时变量);
                当前层数++;
                continue b;
            }else { //没有

                //该节点是否有父亲?
                boolean 前进条件2=false;
                if(当前层数!=1){
                    c:for (HashMap<String,Object> 每层的每个元素: 图.get(当前层数)) {
                        if((String)每层的每个元素.get("元素")==临时变量){
                            前进条件2=true;
                            临时变量=((ArrayList<String>)每层的每个元素.get("父亲")).get(0);
                            break c;
                        }
                    }
                }


                if(前进条件2){   //有
                    当前层数--;
                    continue b;
                }else{  //没有
                    break b;
                }
            }
        }
        System.out.println(返回值);
    }

    public static void 广度优先搜索(HashMap<Integer,ArrayList<HashMap<String,Object>>> 图){
        ArrayList<String> 返回值=new ArrayList<>();
        for (int i = 1; i <=图.size() ; i++) {
            if(i==1){
                返回值.add((String)图.get(i).get(0).get("元素"));
            }else{
                Set<String> 临时数组=new HashSet<>();
                临时数组=(Set<String>)图.get(i).get(0).get("本层所有元素");
                for (String str: 临时数组) {
                    返回值.add(str);
                }
            }
        }
        System.out.println(返回值);
    }

    public static HashMap<String,Integer> 求和某个节点连接的所有节点(ArrayList<String> 行,ArrayList<String> 列,
                                     ArrayList<Integer> 关系,String 节点){
        int 元素个数=行.size();
        HashMap<String,Integer> 返回值=new HashMap<>();
        int 关系里的起始索引=行.size()*列.indexOf(节点);
        int 关系里的结束索引=行.size()*(列.indexOf(节点)+1)-1;
        for (int j =关系里的起始索引; j <=关系里的结束索引 ; j++) {
            if(关系.get(j)!=0){
                返回值.put(行.get(j%元素个数),关系.get(j));
            }
        }
        return 返回值;
    }

    public static void 普里姆(ArrayList<String> 行,ArrayList<String> 列,
                           ArrayList<Integer> 关系,String 起始节点){

        HashMap<String,Integer> 返回值=new HashMap<>();
        ArrayList<String> 已使用的节点=new ArrayList<>();

        已使用的节点.add(起始节点);
        for(;;){
            String 哪个已使用节点=null;
            String 临时节点=null;
            int 目前最小权值=0;
            for (String 每个节点:已使用的节点) {
                HashMap<String,Integer> 和某个节点连接的所有节点=求和某个节点连接的所有节点(行, 列, 关系, 每个节点);
                Set<String> 所有节点=和某个节点连接的所有节点.keySet();
                for (String str: 所有节点) {
                    if(!已使用的节点.contains(str)){
                        if(目前最小权值==0){
                            目前最小权值=和某个节点连接的所有节点.get(str);
                            临时节点=str;
                            哪个已使用节点=每个节点;
                        }else{
                            if(目前最小权值>和某个节点连接的所有节点.get(str)){
                                目前最小权值=和某个节点连接的所有节点.get(str);
                                临时节点=str;
                                哪个已使用节点=每个节点;
                            }

                        }
                    }



                }
            }
            已使用的节点.add(临时节点);
            返回值.put(哪个已使用节点+"-"+临时节点,目前最小权值);
            if(已使用的节点.size()==行.size()){
                break;
            }
        }
        System.out.println(返回值);
    }

    public static void 克鲁斯卡尔(ArrayList<String> 行,ArrayList<String> 列,
                             ArrayList<Integer> 关系,String 起始节点){
        
    }

    public static void 迪杰斯特拉(ArrayList<String> 行,ArrayList<String> 列,
                             ArrayList<Integer> 关系,String 起始节点){


        LinkedList<String> 未遍历=new LinkedList<>();
        HashMap<String,Integer> 最短路径权值=new HashMap<>();
        最短路径权值.put(起始节点,0);
        HashMap<String,ArrayList<String>> 最短路径路程=new HashMap<>();
        ArrayList<String> 初始最短路径路程值=new ArrayList<>();
        初始最短路径路程值.add(起始节点);
        最短路径路程.put(起始节点,初始最短路径路程值);
        LinkedList<String> 临时数组外部=new LinkedList<>();
        临时数组外部.add(起始节点);

        //初始化未遍历对象
        for (String str: 行) {

                未遍历.add(str);

        }



        while(未遍历.size()!=0){
            System.out.println("临时数组外部"+临时数组外部);
            ArrayList<String> 临时数组内部=new ArrayList<>();

            //临时数组内部需要排序

            for (String str: 临时数组外部) {

                未遍历.remove(str);

                //111111111111111111111
                HashMap<String,Integer> 关系表=求和某个节点连接的所有节点(行,列,关系,str);
                Set<String> 关系表键集合=关系表.keySet();
                System.out.println("str"+str);
                System.out.println("关系表键集合"+关系表键集合);

                //22222222222222222222
                Set<String> 最短路径权值键集合=最短路径权值.keySet();
                for (String str2: 关系表键集合) {
                    System.out.println("aaaaa:"+str2);
                    System.out.println(最短路径权值键集合);
                    //3333333333333333
                    if(最短路径权值键集合.contains(str2)){

                        //55555555555555555555555555555
                        int 上面的值=最短路径权值.get(str)+关系表.get(str2);
                        int 下面的值=最短路径权值.get(str2);

                        //777777777777777777777
                        if(上面的值>下面的值){

                        }
                        //8888888888888888888888
                        else{
                            最短路径权值.put(str2,最短路径权值.get(str)+关系表.get(str2));
                            ArrayList<String> linshi=new ArrayList<>();
                            for (String str3:最短路径路程.get(str)) {
                                linshi.add(str3);
                            }
                            linshi.add(str2);
                            最短路径路程.put(str2,linshi);
                        }

                    }
                    //4444444444444444
                    else{

                        //66666666666666666
                        最短路径权值.put(str2,最短路径权值.get(str)+关系表.get(str2));
                        ArrayList<String> linshi=new ArrayList<>();
                        for (String str3:最短路径路程.get(str)) {
                            linshi.add(str3);
                        }
                        linshi.add(str2);
                        最短路径路程.put(str2,linshi);
                        临时数组内部.add(str2);
                    }
                }

            }


                临时数组外部.clear();
                for (String str4:临时数组内部) {
                    临时数组外部.add(str4);
                }



        }
        System.out.println(最短路径权值);
        System.out.println(最短路径路程);

    }

}

5 排序

5.1 插入排序

5.1.1 直接插入排序

O( (N+1)*(N/2))

5.1.2 二分法插入排序

O(nlgn)


5.1.3 希尔排序

不稳定的排序

5.2 选择排序

5.2.1 简单选择排序

O( (N+1)*(N/2))

5.2.2 堆排序

大堆:二叉树里父节点比左右孩子节点都大
小堆:二叉树里父节点比左右孩子节点都小
O(nlgn)

5.3 交换排序

5.3.1 冒泡排序

O(N²)

5.3.2 快速排序

O (nlogn)

5.4 归并排序

5.5 基数排序

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354