Tüm Platformlar için Hızlı Uygulama Geliştirme --->    Kitabımız...      Delphi

Konuyu Paylaş : facebook gplus twitter

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.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
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...
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.

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
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.
Bizi Toprağa Gömdüler Fakat Tohum Olduğumuzu Bilmiyorlardı.
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

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Unit.pas dosyaları ve Uses kullanımı nehirnnn 2 146 05-01-2018, Saat: 01:52
Son Yorum: masteryoda
  XML Json dosyaları ile Çalışma masteryoda 8 330 30-09-2017, Saat: 22:32
Son Yorum: Fesih ARSLAN
  Flash belleğe bulaşıp dosyaları gizli partitiona taşıyan virüs denem3 17 975 08-02-2017, Saat: 06:21
Son Yorum: denem3



Konuyu Okuyanlar: 1 Ziyaretçi