Hallo BlackJack,
danke für die Antwort.
Meine Routine war, wie geschrieben, zusammengepfuscht - daher auch die sinnlosen Variablennamen.
Normalerweise verwende ich durchaus lange und lesbare Namen
Deine Routine erfüllt leider nicht den Zweck, den ich brauche.
Bei dir kommen die Zahlen ja schon in der richtigen Reihenfolge an.
Was ich brauche ist:
- Eine Zahl wie z.B. 15 (1111) ist gegeben, dann rufe ich eine Routine auf, um davon die Zahl 7 (0111) geliefert zu bekommen.
- Oder eben bei 7 eine 11 und bei 11 eine 3 u.s.w.
Der Einsatzzweck ist ein Progrämmchen, das die Dateien in meinen "Download-Ordnern" so zusammenstellt bzw. auswählt, dass ich damit eine BlueRay randvoll füllen kann. Klappt auch schon sehr gut. Obwohl die Dateien alle im dreistelligen MB-Bereich liegen, komme ich nach ein paar Sekunden Volllast auf einem Core auf unter 10KB Restkapazität (meinem Abbruchkriterium) - bei 24GB Gesamtkapazität.
Der Algorithmus sieht vor, die Dateien nach Größe zu sortieren, dann solange die großen Dateien zuzufügen, bis die jeweils nächst-kleinere Datei nicht mehr auf den Datenträger passt. Hier wird dann die Liste der Dateien getrennt. Der "obere" Teil (mit den kleineren Dateien) wird mehr oder weniger intelligent als Bitmuster hochgezählt (bei einer 1 wird die Datei zur Summe dazugerechnet, bei einer 0 nicht). Wenn dabei aber keine akzeptable Lösung herauskommt, wird der untere Teil (mit den großen Dateien) als Bitmuster heruntergezählt und dann der obere Teil wieder durchlaufen.
Der untere Teil wird "rückwärts" bzw. mit meiner verbesserungswürdigen Routine verändert/durchlaufen.
Sieht dann (nach 6 Sekunden) z.B. so aus:
Code: Alles auswählen
dede@c2q:~> fillBD.py dry
Kapazität auf dem Ziel: 23776 MB
Dateien: 41
---------------------- -XXXXXXXXXXXXXXXXXX 1 GB
---------------------X -XXXXXXXXXXXXXXXXXX 78 MB
XXX----------------X-- X---XXXXXXXXXXXXXXX 13 MB
XXX----------------X-- -X-X-XXXXXXXXXXXXXX 9 MB
XXX----------------X-- --XXXX-XXXXXXXXXXXX 5 MB
--XXXX------------X--- --XX-X-XXXXXXXXXXXX 1 MB
-----XXXXXX------X---- ---X---XXXXXXXXXXXX 168 KB
----XXXX-------X------ XXX--X-XX-XXXXXXXXX 48 KB
----XXXX-------X------ XX-X-XX-X-XXXXXXXXX 24 KB
---XXXXXXXXX-------X-- --XXX-X-----XXXXXXX 8 KB
Wobei die X'e die Dateien kennzeichnen, die zusammen die rechts angezeigte Restkapazität ergeben.
Sicherlich ließe sich mein Algorithmus irgendwie so umbauen, dass ich auf diese unsägliche Routine verzichten könnte.
Aber ich habe jetzt schon so lange mit Rucksack- und 0/1-Teilsummen-Algorithmen rumgewurschtelt....und das war alles viel zu langsam....und jetzt habe ich keine Lust mehr auf tiefergehene Algorithmus-Änderungen (abgesehen von dieser einen hässlichen Funktion)....weil es jetzt schnell und korrekt arbeitet.
Wenn das Tool hinreichend getestet ist und mir Programmcode-technisch nicht völlig peinlich sein muß, werde ich es hier ablegen:
http://dede67.bplaced.net/PhythonScript ... Seite.html
(gerne auch mit Namensnennung im Header von Demjenigen, der mit eine hübschere highbit_dec() sponsert)
Detlev