Как изменить временную сложность DFS O (V ^ 2) на O (V + E) или O (V + 2E) для ненаправленных графов - PullRequest
1 голос
/ 25 апреля 2020

Пытаясь улучшить свои алгоритмы, я пытался написать код DFS с O (V + 2E) сложностью по времени, но, похоже, я в итоге получил O (V ^ 2). Пожалуйста, помогите мне с исправлением кода. Я могу использовать рекурсивный процесс, переместив один из циклов while в подпрограмму. Это единственный способ исправить это, или мы можем сделать что-то еще, чтобы это исправить.

package com.dfs;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Stack;

public class MainMethod {

/**
 * @param args
 */

public static void main(String[] args) {
    List<List<Integer>> nodesList = new ArrayList<List<Integer>>();
    List<Integer> list1 = new ArrayList<>();
    List<Integer> list2 = new ArrayList<>();
    List<Integer> list3 = new ArrayList<>();
    List<Integer> list4 = new ArrayList<>();
    List<Integer> list5 = new ArrayList<>();
    List<Integer> list6 = new ArrayList<>();
    list1.add(1);
    list1.add(2);
    list2.add(3);
    list2.add(2);
    list3.add(3);
    list4.add(4);
    list5.add(5);
    list5.add(1);
    list5.add(0);
    nodesList.add(list1);
    nodesList.add(list2);
    nodesList.add(list3);
    nodesList.add(list4);
    nodesList.add(list5);
    nodesList.add(list6);

    //List to check vertext has been visted or not
    List<List<Integer>> vertexVisitCheck = new ArrayList();
    Stack<List<Integer>> tobeExplored = new Stack<>();
    System.out.println(nodesList);
    int startnode = 0;
    tobeExplored.push(nodesList.get(startnode));
    System.out.println("Added to the Stack ===> "+nodesList.get(startnode));
    while(!tobeExplored.isEmpty())
    {
        List<Integer> nextVertex = tobeExplored.peek();;
            vertexVisitCheck.add(nextVertex);
            Iterator<Integer> iterator = nextVertex.iterator();
            int counter = nextVertex.size();
            while (iterator.hasNext()) {
                int check =  iterator.next();
                if(!vertexVisitCheck.contains(nodesList.get(check)))
                {
                    tobeExplored.push(nodesList.get(check));
                    System.out.println("Added to the Stack ===> "+nodesList.get(check));
                    if(tobeExplored.peek().size()==0)
                    {
                        vertexVisitCheck.add(nodesList.get(check));
                        tobeExplored.pop();
                    }
                        break;
                }
                if(--counter==0)
                {
                    vertexVisitCheck.add(nodesList.get(check));
                    tobeExplored.pop();
                }       
          }
     }
 }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...