2 votes

Algorithme d'ordonnancement des tâches avec délai individuel

J'ai n tâches, chacune ayant une date limite et un temps d'exécution spécifiques. Cependant, je ne peux pas terminer toutes les tâches dans les délais impartis. Je dois organiser ces tâches de manière à minimiser le délai de la tâche par rapport au temps de réalisation. Considérons ce cas (les valeurs de gauche sont les délais et les valeurs de droite sont le temps que prend la tâche) :
2 2
1 1
4 3
Ces trois tâches peuvent être effectuées de manière optimale comme suit :

temps 1 : tâche 2 - tâche 1 terminée ; 0 dépassement pour la tâche 2
temps 2 : tâche 1
temps 3 : tâche 1 - tâche 2 terminées ; 1 dépassement pour la tâche 1
temps 4 : tâche 3
temps 5 : tâche 3
temps 6 : tâche 3 - tâche 3 terminée ; 3 dépassements pour la tâche 3

J'ai besoin d'un algorithme plus rapide pour cela ; mon objectif est de trouver le dépassement maximum de tous les dépassements (dans le cas ci-dessus, c'est 3). Pour l'instant, je trie les tâches en fonction des délais, mais ce n'est pas rapide, car lorsqu'une nouvelle tâche est ajoutée, je dois trier la liste entière. Existe-t-il un autre moyen ?


Après la suggestion de Lawrey, j'utilise PriorityQueue mais cela ne me donne pas un tri exact. Voici mon code :

class Compare2DArray implements Comparator<int[]> {
public int compare(int a[], int b[]) {
    for (int i = 0; i < a.length && i < b.length; i++)
        if (a[i] != b[i])
            return a[i] - b[i];
    return a.length - b.length;
}
}

public class MyClass{
    public static void main(String args[]) {
        Scanner scan = new Scanner(System.in);
        int numberOfInputs= scan.nextInt();
        PriorityQueue<int[]> inputsList = new PriorityQueue<int[]>(numberOfInputs,new Compare2DArray());
        for (int i = 0; i < numberOfInputs; i++) {
            int[] input = new int[2];
            input[0] = scan.nextInt();
            input[1] = scan.nextInt();
            inputsList.add(input);

        }
    }

Mais c'est le tri de cette file de tableaux

2 2
1 1
4 3
10 1
2 1

comme

1 1
2 1
4 3
10 1
2 2

au lieu de

1 1
2 1
2 2
4 3
10 1

Le même comparateur fonctionne bien pour le tri des listes. Je ne comprends pas ce qui ne va pas avec PriorityQueueue.

4voto

peeyush1234 Points 41

La file d'attente prioritaire est mise en œuvre en utilisant des tas . Par conséquent, lorsque vous parcourez les éléments de la file d'attente prioritaire, il n'est pas garanti que vous obteniez tous les éléments dans un ordre trié. C'est pourquoi vous n'obtenez pas le tableau trié souhaité.

J'ai également rencontré le même problème pour la question. J'ai fini par utiliser multimap en c++. Mais la complexité temporelle ne s'est pas beaucoup améliorée.

1voto

Peter Lawrey Points 229686

À moins que vous n'ayez une très longue liste de tâches, par exemple des millions, cela ne devrait pas prendre autant de temps.

Cependant, ce dont vous avez besoin est probablement une PriorityQueue qui a O(1) add et O(ln N) take.

0voto

Rachee Singh Points 106

J'ai tenté de répondre à la même question (elle vient d'interviewstreet, je suppose). Avez-vous reçu cet ordre :

1 1, 2 1, 4 3, 10 1, 2 2

quand vous avez imprimé le tas ? Avez-vous essayé de retirer les éléments du tas un par un et de vérifier leur ordre ? Je dis cela parce que mon implémentation est en python et que lorsque j'imprime le tas, j'obtiens le même ordre que vous. Mais ce n'est pas le sujet ici, je pense, puisque lorsque je sors des éléments du tas, un par un, j'obtiens un ordre approprié qui est :

1 1, 2 1, 2 2, 4 3, 10 1

Voici à quoi ressemble mon code en python : (J'utilise la bibliothèque heapq pour implémenter la file d'attente prioritaire) Pour ajouter des éléments au tas :

[deadline, minutes] = map( int, raw_input().split() )
heapq.heappush( heap, ( deadline, minutes ) )

Pour les retirer du tas :

d, m = heapq.heappop( heap )

Voici le résultat que j'obtiens lorsque j'imprime le tas, puis que je retire des éléments du tas étape par étape :

Tas : [(1, 1), (2, 1), (4, 3), (10, 1), (2, 2)] Emploi occupé : 1 1 Emploi occupé : 2 1 Emploi occupé : 2 2 Emploi occupé : 4 3 Emploi occupé : 10 1

J'espère que cela vous aidera !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X