Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Dosyaları Belirli Boyutta Gruplandırma
#1
Merhaba Arkadaşlar,

Bir algoritma konusunda desteğinize ihtiyacım var.

Elimde Boyutu 5 MB - 2 GB aralığında değişen yüzlerce video var.

Bu videoları DVD'ye yedekleyebilecek şekilde gruplayarak verimli bir biçimde ayırmam gerekiyor.


Örnek DVD 4.7GB kapasiteye sahip Tolerans verelim 4.5 GB olsun.

İlk video 2GB, 
ikinci video 2GB,  
üçüncü video 1GB dolayısıyla ilk 3'ü dvd sınırını aştı atlayarak devam ediyorum, kalan 500mb'lik videoyu bulmak için, bulursam onu alacağım 3. olarak bulamazsam 400mblik bir video sonrasında 100mblik video bularak bir şekilde en verimli biiçimde gruplandıracağım.

Dosya listeleme ve boyutunu tespit etmek kolay. Sıralama mantığını siz olsanız nasıl çözerdiniz.
WWW
Cevapla
#2
var
posta: Array of String;
doldu: Boolean;
kalan: Integer;
i: Integer;

begin
i:= 0;
kalan = 45000000;
for dosya in dosyalar do
   if dosya.Boyutu < kalan then
   begin
       posta[i]:= dosya.Yolu;
       kalan:= kalan - dosya.Boyutu;
       i:= i+1
   end
   else
       exit;
end;

Kafamda oluşan birşeyleri kaba taslak telefondan karaladım. Hatalarım vardır illa ki. Mazur gör. Senin de aklına böylen birşey geldi mi bilmiyorum ama umarım yardımcı olur.

İyi Çalışmalar...
Z7HWzZNFQYYsFui_gNRNO4nQ5jO9_aTWbllb_cmW...w1366-h654
WWW
Cevapla
#3
İstediğine bakılırsa dosyaları boyutana göre (büyükten küçüğe) sıraladıktan sonra sırayla dosyaları almak ya da atlamak şeklinde bir algoritma oluşturabilirsin.
Cevapla
#4
Tam emin olamadım ama veri kümeleme algoritmaları ile bir sonuca ulaşılabilir belki. K-means kümeleme sanki sizin problemin çözümüne daha uygun gibi geldi.
Bu linkde çeşitli kümeleme algoritmaları hakkında kısa bilgiler var.

http://www.academia.edu/9860553/Veri_Mad...B6ntemleri
Cevapla
#5
Basit bir sıralama algoritmasıyla boyutları küçükten büyüğe yada tersi şekilde sıraladıktan sonra dosyaların oluşturduğu toplam boyutun 4.7 gb 'ye bölünmesinden elde edilen sayı ile toplam video sayısı bölünerek ortalama bir dvd'ye kaç dosya düştüğü hesaplandıktan sonra,her dvd için dosya sayısını bu şekilde ayarlanacağı basit bir algoritma yapılabilir.Yani örneğin elimizdeki dosyaların toplam boyutu 47 gb olsun ve dosya sayımız da 75 olsun. 47/4.7 =10
75/10=7,5 .Bu işleme göre elimizdeki dosyaların tamamını 10 dvd'ye yazarız.Her dvd ortalama 7 küçüklü büyüklü  dosyadan oluşur.hatta kalanı +5 olarak düşünürsek 5 dvdmiz 8 dosyadan 5 dvdmiz 7 dosyadan oluşur.Böylece dvd başına düşen dosya boyutu da 4.7'ye çok yakın olur.
Herhangi bir basit problem, hakkında yeterince toplantı yapılarak, çözümsüz hale getirilebilir.
https://play.google.com/store/apps/developer?id=ONGUN
WWW
Cevapla
#6
Ben olsam dosyaları boyutlarına göre büyükten küçüğe doğru sıraladıktan sonra hedef boyuta varıncaya kadar dosyaları teker teker eklerdim.

Klasör içindeki dosyaları boyutları ile birlikte tespit etmek için FindFirst, FindNext, FindClose gibi komutları kullanıyoruz. Bu esnada bize dosya ile ilgili bilgiler TSearchRec tipinde geliyor. O zaman dosya isimlerimizi tutmak için bu tipin bir listesini oluşturabiliriz: TList<TSearchRec>
Bu listeye klasördeki tüm dosyaların bilgilerini atıp sonra da boyuta göre sıralamalıyız
uses Generics.Collections, Generics.Defaults;

var
  SearchRec, FileInfo: TSearchRec;
  FileList: TList<TSearchRec>;
  rsp: Integer;
  CurrentSize, FileSize: Int64;
begin
  FileList := TList<TSearchRec>.Create;
  try
    rsp := FindFirst(KLASOR + '*.*', faAnyFile, SearchRec);
    while rsp = 0 do
    begin
      if (SearchRec.Attr and faDirectory <> faDirectory) then
        FileList.Add(SearchRec);
      rsp := FindNext(SearchRec);
    end;
    FindClose(SearchRec);

// Bu aşamada FileList içinde KLASORdeki tüm dosyalarla ilgili bilgiler mevcut.
// Bunları dosya boyutuna göre sıralayalım:

    FileList.Sort(TComparer<TSearchRec>.Construct(
      function(const Left, Right: TSearchRec): Integer
      begin
        Result := Right.Size - Left.Size;
      end
    ));

// Artık hedeflenen boyuta kadar dosyalarımızı seçebiliriz. 
// Ben dosya isimleri ListBox içinde göstermeyi seçtim.

    CurrentSize := 0;

    for FileInfo in FileList do
    begin
      FileSize := TSearchRec(FileInfo).Size;
      if CurrentSize + FileSize < HEDEF_BOYUT then  // HEDEF_BOYUT byte cinsinden
      begin
        ListBox1.Items.Add(FileInfo.Name + ' - ' + IntToStr(FileSize));
        CurrentSize := CurrentSize + FileSize;
      end;
    end;

  finally
    FileList.Free;
  end;
There's no place like 127.0.0.1
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  XML Json dosyaları ile Çalışma masteryoda 10 8.792 10-08-2022, Saat: 23:21
Son Yorum: varyemez
  IP deki bir klasör içindeki dosyaları listeleme nasıl? sadikacar60 21 8.383 18-02-2022, Saat: 13:48
Son Yorum: cinarbil
  Yedeklenmiş dosyaları dışarı aktarma cinarbil 2 855 07-07-2021, Saat: 15:26
Son Yorum: bydelphi
  [ÇÖZÜLDÜ] Tablodaki verileri belirli bir düzenle memoya aktarma shooterman 8 2.879 25-12-2020, Saat: 17:14
Son Yorum: hi_selamlar
  PDF Dosyaları ikurt07 2 1.217 11-09-2020, Saat: 23:43
Son Yorum: mcuyan



Konuyu Okuyanlar: 1 Ziyaretçi