2016-06-22 9 views
1

Dies ist mathematische Aufgabe. Ich muss eine Bestellliste (oder eine Warteliste) aus X-Werten erstellen - jeder ist Prozent und Summe von allen ist 100. Ich möchte die logische Reihenfolge dieser Werte. Mal sehen dies:Erstellen Sie logisch geordnete Warteschlange Liste von Prozentwert

a = 50, 
b = 25, 
c = 15, 
d = 10 

Der größte gemeinsame Teiler dieser Zahlen ist 5, so der Warteschlange sollte Länge 100/5 = 20. Und das Ergebnis sollte wie folgt aussehen (oder sehr ähnlich):

a, b, a, b, a, c, a, b, a, d, a, c, a, b, a, c, a, b, a, d 

Ich bin auf der Suche nach Formel wie zu dieser Bestellung. Danke im Voraus.

+0

Wie ist diese Reihenfolge mit gcd? Ich bin mir nicht sicher, was genau Sie erreichen wollen. – Shubham

Antwort

2

Ich nehme an, dass Sie jeden Buchstaben so gleichmäßig wie möglich über das Array oder die Zeichenfolge verteilen möchten. Der vorläufige Schritt, den größten gemeinsamen Teiler zu finden und die Zahlen 50,25,15,10 damit zu teilen, ist einfach. Sobald dies erledigt ist, erhalten Sie die Anzahl der Male, die jeder Buchstabe erscheinen muss. Dann kann der Algorithmus sein: beginnend mit der leeren Zeichenfolge, addiere den "am meisten unterrepräsentierten" Buchstaben, wiederhole. Ich definiere "am meisten unterrepräsentiert" als diejenige mit der maximalen Differenz von (gewünschter Anteil) - (bisheriger Anteil).

Hier ist dieser Algorithmus in Python implementiert.

count = {'a': 10, 'b': 5, 'c': 3, 'd': 2} 
length = sum(count.values()) 
str = '' 
while len(str) < length: 
    deficit = {} 
    for char in count: 
     deficit[char] = count[char]/length - (str.count(char)/len(str) if str else 0) 
    str += max(deficit, key=deficit.get) 
print(str) 

Der Ausgang ist abcadabacabadabacaba. Aufgeteilt nach Buchstabe, um die Verteilung anzuzeigen:

a..a.a.a.a.a.a.a.a.a 
.b....b...b...b...b. 
..c.....c.......c... 
....d.......d.......