Планирование массива из 3 элементов во избежание тупика - PullRequest
0 голосов
/ 22 мая 2018

Учитывая массив из 3 строковых элементов ["0", "1", "2"], все они изначально отображаются как доступные, максимальное количество элементов, которое может быть назначено, равно 2, после того, как 2 элемента были назначены(Запланировано), больше элементов не может быть назначено.Исходя из этой предпосылки, может произойти следующий сценарий.

(примечание: легко понять из кода)

Сценарий 1: процесс P1 запрашивает элемент, и ему присваивается элемент "0" (элемент "0", затем становится недоступным для назначения любомудругой процесс, поскольку он удерживается процессом P1), затем процесс P2 запрашивает элемент и получает элемент «1» - и теперь массив достиг максимальной емкости планирования.Любой процесс (P1 / P2) может отказаться от своего элемента в любой момент времени.Если процесс P2 отказывается от своего элемента «1», то процесс P3 запрашивает элемент, ему должен быть присвоен / назначен элемент «2» (поскольку элемент 2 никогда не был назначен).Любой процесс (P1 / P3) может отказаться от своего элемента в любой момент времени.Если процесс P1 отказывается от своего элемента «0», следующим доступным элементом, который может быть назначен, является элемент «1» (поскольку в массиве доступны два элемента («1», «0»). Весь этот цикл может произойти для P (n) процессы, при условии, что поддерживается правило не более двух.

Как я могу назначить МАКСИМАЛЬНО из 2 элементов, всегда избегая голодания элементов? (учитывая, что процессы в любом порядке,можете отказаться от своих элементов)

public class Main {

public static void main(String[] args)
{
    myScheduler p = new myScheduler();

    /* available elements: "0","1","2" imagine them being in a queue */
    /* elements taken: non */
    String show = p.requestElement(); //Should return "0"

    /* available elements: "1","2" imagine them being in a queue */
    /* elements taken: "0" */
    System.out.println(show);

    show = p.requestElement(); //Should return "1"

    /* available elements: "2" queue cannot be empty */
    /* elements taken: "0","1" imagine them being a linked list (at most 2 elements can be taken) */
    System.out.println(show);

    show = p.requestElement(); //Should return "full"
    /* available elements: "2" queue cannot be empty */
    /* elements taken: "0","1" note: it didn't change (at most 2 elements can be taken) */
    System.out.println(show); 
    show = p.abandonElement("1"); //Should return "1"
    /* available elements: "2","1" imagine them being in a queue */
    /* elements taken: "0" */
    System.out.println(show);
    show = p.requestElement(); //Should return "2"
    /* available elements: "1" queue cannot be empty */
    /* elements taken: "0","2" (at most 2 elements can be taken) */
    System.out.println(show);
    show = p.requestElement(); //Should return "full"
    /* available elements: "1" queue cannot be empty */
    /* elements taken: "0","2" note: it did not change (at most 2 elements can be taken) */
    System.out.println(show);
    show = p.abandonElement("0"); //Should return "0"

    /* available elements: "1","0" */
    /* elements taken: "2" */
    System.out.println(show);
    show = p.requestElement(); //Should return "1"

    /* available elements: "0" */
    /* elements taken: "2","1" */
    System.out.println(show);
}
public class myScheduler {

private String [] array;
public myScheduler()
{
    array = {"0","1","2"};
}
public String requestElement(){
    /*This function returns the element given to this request, if array has already assigned 2 elements, return "full" */
}

public String abandonElement(String element){
    /*This function returns the element to be abandoned, if the element doesnt exist, return "not found" */
}

1 Ответ

0 голосов
/ 22 мая 2018

Итак, вот что я хотел бы сделать: построить LinkedList<>(), чтобы отслеживать, какое время было забронировано первым.(Очереди FIFO - сначала во-первых, потом) Затем создайте final ArrayList<>(), чтобы отслеживать время, которое вы можете забронировать.(Вы хотите, чтобы ваши пользователи могли бронировать 0, 1, и 2)

Вот мой код:

//Add the three choices. Make the ArrayList final so nobody can change it
public static final ArrayList<String> array = new ArrayList<>(); {{
    array.add("0");    
    array.add("1");
    array.add("2");
}}
public static LinkedList<String> linked = new LinkedList<>(); {{
  linked.add("0");
  linked.add("1");
  linked.add("2");
 }}

public String requestElement(){
    /*This function returns the element given to this request, if array has already assigned 2 elements, return "full" */
   String result = "full";  //Assume the result is full
   if(linked.size()==1) {  //If only one time is available return full 
       return result;
   }
   result = linked.poll();    //Poll the first item on the queue
   return result;
}
public String abandonElement(String element){
    /*This function returns the element to be abandoned, if the element doesnt exist, return "not found" */
    String result = "Not Found";
    if(array.contains(element)) {   //If the arrayList contains the element, add it back to the LinkedList
        linked.add(element);
        result = element;
    }
    return result;

}

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы!

...