[CB-lug] programma per ottimizzare lo spazio

redcloud redcloud@alice.it
Mar 8 Ago 2006 01:57:54 CEST


Salve a tutti! Avete molti file da masterizzare e non volete sprecare lo 
spazio prezioso dei vostri dvd? Da oggi c'è "DSO"!!! Questo simpatico 
programmillo (da me ideato e realizzato in un paio di giorni) permette 
di trovare la migliore combinazione di file che occupano al meglio lo 
spazio disponibile.


INPUT: directory contenente i file da analizzare, spazio a disposizione 
(in byte)

$ ./dso ./ 92800


OUTPUT: lista delle soluzioni migliorative
------------------------------------------
Files found: 149
WARNING: files in directory are more than recommended (30).
Press CTRL+C to exit.
  10 sec. to go...
   9 sec. to go...
   8 sec. to go...
   7 sec. to go...
   6 sec. to go...
   5 sec. to go...
   4 sec. to go...
   3 sec. to go...
   2 sec. to go...
   1 sec. to go...

   1)            4096 byte - .googleearth
1) SOL: 4096 byte    WM: 92800 byte    DIFF: 88704 byte

   1)            4096 byte - .fluxbox
   2)            4096 byte - .googleearth
2) SOL: 8192 byte    WM: 92800 byte    DIFF: 84608 byte

   1)             110 byte - .csmashrc
   2)            4096 byte - .fluxbox
   3)            4096 byte - .googleearth
3) SOL: 8302 byte    WM: 92800 byte    DIFF: 84498 byte

   1)            4096 byte - MonoProjects
   2)            4096 byte - .fluxbox
   3)            4096 byte - .googleearth
4) SOL: 12288 byte    WM: 92800 byte    DIFF: 80512 byte

   1)            4096 byte - MonoProjects
   2)             110 byte - .csmashrc
   3)            4096 byte - .fluxbox
   4)            4096 byte - .googleearth
5) SOL: 12398 byte    WM: 92800 byte    DIFF: 80402 byte

.
..
...

   1)            4096 byte - .fblevels
   2)            4096 byte - .inkscape
   3)            2144 byte - .asoundrc
   4)           12276 byte - .libquicktime_codecs
   5)            4096 byte - .gnusound
   6)             559 byte - log.txt
   7)             584 byte - dares.log
   8)            4096 byte - .gnupg
   9)            4096 byte - .cache
  10)            4096 byte - .gtodo
  11)             961 byte - .BOINC Manager
  12)            4096 byte - .balazar_saved_games
  13)            4096 byte - .armagetron
  14)           10477 byte - dso
  15)            4096 byte - .nexuiz
  16)            4096 byte - .loki
  17)            4096 byte - .wine
  18)            4248 byte - dso.c
  19)            4096 byte - d
  20)            4096 byte - MonoProjects
  21)             110 byte - .csmashrc
  22)            4096 byte - .fluxbox
  23)            4096 byte - .googleearth
84) SOL: 92799 byte    WM: 92800 byte    DIFF: 1 byte
------------------------------------------

SOL è lo spazio occupato dalla soluzione attuale
WM è lo spazio disponibile dato in input
DIFF è WM - SOL

Data la natura del problema (enumerazione di sottoinsiemi), la 
complessità temporale è O(2^n) (fortunatamente la complessità spaziale 
delle chiamate ricorsive utilizzate dall'algoritmo è O(n)), quindi è 
estremamente consigliato analizzare liste di file < 30. Con 30 file in 
in quarto d'ora (sul mio Sempron 1800MHz) si riesce ad ottenere un 
risultato certo. Tuttavia è possibile ottenere risultati soddisfacenti 
anche con liste di file > 30 (il programma ammette 10000 file). 
Nell'output di prova di cui sopra ho considerato una lista di 149 file. 
Per avere un risultato certo, il programma avrebbe dovuto analizzare 
2^149 combinazioni... un bel po' di tempo! Dopo solo 3 minuti però ho 
ottenuto la soluzione numero 84 che mi lascia libera solo 1 byte (come 
si può vedere dal parametro DIFF), soluzione decisamente soddisfacente!

Se analizzate più di 30 file (più di 15 minuti di attesa su un Sempron 
1800MHz per ottenere una soluzione certa) e avete individuato una 
soluzione soddisfacente e non volete attendere ancora inutilmente il 
termine del programma, potete premere sempre CTRL+C ;)

Da compilare con "gcc dso.c -o dso"

P.s. se volete potete pubblicarlo sul sito del LUG.
-------------- parte successiva --------------
Un allegato non testuale è stato rimosso....
Nome:        dso.c
Tipo:        text/x-csrc
Dimensione:  4248 bytes
Descrizione: non disponibile
Url:         http://lists.linux.it/pipermail/lugcb/attachments/20060808/cb425d0a/dso.c


Maggiori informazioni sulla lista Lugcb