我的代码太复杂了,还是我的笔记本电脑不能运行它?

来源:爱站网时间:2021-09-25编辑:网友分享
我目前正在学习数据结构和算法课程,我们已经完成了两个项目,它们以略有不同的方式完成相同的任务。第一个项目创建一个数组(...

问题描述


我目前正在学习数据结构和算法课程,我们已经完成了两个项目,它们以略有不同的方式完成相同的任务。

第一个项目创建了一个数组(包含我们的“生态系统”或“河流”),其中包含500个动物对象,它们被标记为熊,鱼或空。这些数组名称是随机分配的。然后,每个单元格尝试移动到另一个随机单元格。如果熊和熊相遇,则另一个小熊(熊的“伴侣”)将填充一个空单元格。鱼和鱼也一样。如果熊遇到一条鱼,反之亦然,则该鱼被“吃掉”(变成一个空单元格)。关键是运行代码,直到整个数组充满熊为止。

我们完成的第二个项目执行相同的操作,不同之处在于它使用了双向链接列表,每个节点要么随机移动到其旁边的节点,要么保持原状。我已经开发了这些项目,但是现在我们应该创建一个代码,该代码乘以运行具有不同生态系统容量的每个项目所需的时间。

我一直在使用chromebook进行编码,这虽然很困难,但是很容易管理。但是,对于此作业,即使我尝试将其放置几个小时,也无法运行所有代码。我不确定我的程序是否过于复杂,或者我的chromebook无法处理数据。我想知道是否有人可以运行我的Java文件来查看它仅仅是我还是它不能真正有效地运行。我重写了第一个项目的代码,以便每个单元仅尝试移至它旁边的单元,以查看这是否更简单,但仍无法在合理的时间内完成运行。

编辑

我不确定要添加哪个代码,因为我使用了很多不同的文件。我想我将在下面将每个文件都分隔开来发布。

首先,我有一个动物类,这两个项目都相同:

package HW4;

public class Animal {
    private String species;

    public Animal(String s) {
        species = s;
    }

    public String getSpecies(){
        return species;
    }

    public void setSpecies(String newSpecies) {
        species = newSpecies;
    }
}

然后,对于我的数组项目,我有River类来构建函数,而Main类则单独运行。这是河课:

package HW4;

import Project2.Animal;

import java.util.Random;

public class River {
    //instance variables
    private int numAnimals = 0;
    public Animal[] emptyRiver; //array of Animal classes named river

    //constructor
    public River(int capacity) {
        numAnimals = capacity;
        emptyRiver = new Animal[numAnimals]; }

    //methods
    public void fillRiver() {
        Random rand = new Random();
        for(int i = 0; i 

这是我的主语:

package HW4;

import Project2.River;

public class Main {
    public static void main(String[] args) {
        River myRiver = new River(500);
        myRiver.fillRiver();
        System.out.println("The river has been initialized.");
        myRiver.printRiver();
        int counter = 1;

        while (myRiver.isallbears()==false) {
            System.out.println("\n" + "Year: " + counter);
            myRiver.timeStep();
            myRiver.printRiver();
            counter++;
        }
        System.out.println("\n" + "The river is now all bears.");
    }
}

对于第二个使用双向链表的项目,我使用了相同的动物类,然后使用了一个名为AnimalLinkedLists的类。与上一个不同,这个包含了我的主要内容。看起来像这样:

package HW4;
import HW3.Animal;

import java.util.Random;

public class AnimalLinkedList {

    private static class Node {
        //instance variables
        //elements are animals
        private Animal animal;
        //references to adjacent nodes
        private Node next;
        private AnimalLinkedList.Node prev;

        //constructor
        public Node(Animal a, Node n, Node p) {
            animal = a;
            next = n;
            prev = p;
        }

        //Access methods
        public Animal getAnimal() {
            return animal;
        }

        public Node getPrevious() {
            return prev;
        }

        //update methods
        public void setNext(Node n) {
            next = n;
        }

    }

    //instance variables
    private Node head = null; //head node of list (or null if empty)
    private Node tail = null; //tail node of list (or null if empty)
    private int size = 0; //number of nodes in the list

    //access methods
    public int size() {
        return size;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public Animal last() { //return element of last node
        if (isEmpty()) return null;
        return tail.getAnimal();
    }

    //update method
    public void addFirst(Animal a) {
        if (isEmpty()) {
            Node newNode = new Node(a, null, null);
            head = newNode;
            tail = newNode;
            size++;
        } else if (size == 1) {
            Node newNode = new Node(a, null, head);
            head.setNext(newNode);
            head = newNode;
            tail.setNext(newNode);
            size++;
        } else {
            Node newNode = new Node(a, null, head);
            head.setNext(newNode);
            head = newNode;
            size++;
        }
    }

    public int capacity;
    public void fillList(int capacity) {
        Random rand = new Random();
        int i = 0;
        while (i  currNode = head;
            do {
                if (currNode.getAnimal().getSpecies() == "Bear") {
                    bearCount++;
                } else if (currNode.getAnimal().getSpecies() == "Fish") {
                    fishCount++;
                } else {
                    nullCount++;
                }
                currNode = currNode.prev;
            } while (currNode != null);

            System.out.println("Number of Bears: " + bearCount);
            System.out.println("\nNumber of Fish: " + fishCount);
            System.out.println("\nNumber of Nulls: " + nullCount);
        }
    }

    //animals meeting
    public void checkMove(Node curr, Node next) {
        if (curr.getAnimal().getSpecies() == "Bear" && next.getAnimal().getSpecies() == "Bear") {
            Node nowNode = head;
            do {
                if (nowNode.getAnimal().getSpecies() == "Null") {
                    nowNode.getAnimal().setSpecies("Bear");
                    break;
                }
                nowNode = nowNode.prev;
            } while (nowNode != null);
        }
        else if (curr.getAnimal().getSpecies() == "Bear" && next.getAnimal().getSpecies() == "Fish") {
            next.getAnimal().setSpecies("Null");
        }
        else if (curr.getAnimal().getSpecies() == "Fish" && next.getAnimal().getSpecies() == "Bear") {
            curr.getAnimal().setSpecies("Null");
        }
        else if (curr.getAnimal().getSpecies() == "Fish" && next.getAnimal().getSpecies() == "Fish") {
            Node nowNode = head;
            do {
                if (nowNode.getAnimal().getSpecies() == "Null") {
                    nowNode.getAnimal().setSpecies("Fish");
                    break;
                }
                nowNode = nowNode.getPrevious();
            } while (nowNode != null);
        }
    }

    //make random movements in list
    public void timeStep() {
        Random rand = new Random();
        Node currNode = head;
        do{
            int x = rand.nextInt(3);
            if (x == 0) {
                if (currNode.next!=null) {
                    checkMove(currNode, currNode.next);
                }
            }
            else if (x==1) {
                if (currNode.prev!=null) {
                    checkMove(currNode, currNode.prev);
                }
            }
            currNode = currNode.prev;
        }while(currNode!=null);
    }

    //find bears
    public boolean isallbears() {
        Node  currNode = head;
        do {
            if (currNode.getAnimal().getSpecies() != "Bear") {
                return false;
            }
            currNode = currNode.prev;
        }while(currNode!=null);
        return true;
    }

    public static void main(String[] args) {
        AnimalLinkedList animalList = new AnimalLinkedList();
        animalList.fillList(500);
        System.out.println("The river has been initiated.\n");
        int year = 1;
        animalList.printList();
        while(!animalList.isallbears()) {
            System.out.println("\nYear: " + year);
            animalList.timeStep();
            animalList.printList();
            year++;
        }
        System.out.println("\nThe river is now all bears.");
    }
}

最后,我的项目将评估不同容量(分别为5000、10000、20000、40000、80000、160000和320000)的时间,如下所示:

package HW4;

public class compTime {
    public static void main(String[] args) {
        int trials = 10;
        long avgTime;

        //array capacity 5000
        long startTime = System.currentTimeMillis();
        for (int i = 0; i 

我希望这不要太混乱,如果需要清除任何内容,我将添加另一个编辑。

思路:


我看到的问题是您的动物实际上从未动过。 checkMove()仅检查交配和食用条件,但熊或鱼在任何时候都不会改变列表中的位置。在您的第一个代码中这不是问题,因为您检查的索引是随机的,但是在第二个代码中,由于空头不动,所以他们吃新鱼的唯一方法是交配。我认为它仍然应该在某个时刻终止,但是可能会花费非常非常长的时间。想象只有一对配对的熊,其余的是鱼。熊吃东西并随后直接交配的可能性很小,因此它需要很长时间才能发生。

我认为问题不在于chromebook,问题在于您的算法。

上一篇:无法反序列化对象。没有定义无参数的构造函数。如果您使用的是ProGuard,请确保未剥离这些构造函数[重复]

下一篇:[在Android中更新CSV文件后更新Listview

您可能感兴趣的文章

相关阅读

热门软件源码

最新软件源码下载