yardıma ihtiyacım var! Görev çözülmedi, demirin sınırlamalarıyla karşılaşıyorum - sayfa 12

 
komposter :


Tüm veritabanı 10 satıra sığar mı, sığmaz mı? tüm dosyalar birlikte
 
Candid :

Ama diziler birbirinden bağımsız mı? O zaman neden bir kez yüklenen dizideki tarihlerde bir kerede bir döngü yapmak imkansız? Bu arada, bazı etkili tekrarlayan algoritmalara geçmek mümkün olabilir, ancak bu ne kadar şanslı. Milyona milyon boyutu kalacak ve dosya bir kez okunacak.

Genel olarak, elbette, bir sonraki yinelemede adım sayısının aynı kaldığı bir problem (yani, hesaplamalar ilerledikçe arama alanı daralmaz) özellikle sağlam görünmez. Ama bu tabi ki subjektif.

Bu tür boyutlardaki özyineleme, önbellek sınırı aşıldığında düşecektir.
 
Pek çok benzer işlem dizisi vardır, her bir dizi zamana göre sıralanmıştır.

Сделки в разных последовательностях разные, по времени распределены неравномерно (и в каждой последовательности по своему). Сделок разное количество. Но все - в интервале от Даты1 до Даты2.

Görev, D1'den D2'ye M dakikalık bir adımla (veya daha iyisi, özellikle tüm dizilerin işlem noktalarına göre) geçmek, K kriterine göre diğerlerinden daha iyi bir dizi bulmaktır (ayrı bir görev sadece en iyi diziyi bulmak için, ancak tüm seti kritere göre sıralamak ve ilk 10'u görüntülemek için - ancak bu isteğe bağlıdır, henüz gerekli değildir).

Kriter K, kendisine karşılık gelen dizinin önceki X işlemi temelinde hesaplanır, hesaplamalarda X işlemlerinin her biri hakkında neredeyse tüm bilgiler kullanılır (örneğin sadece kâr yeterli değildir).

İşte başlamalıydı.

Aşağıdakileri doğru anladım mı:

1) 20 GB'lık bir dosya, zamana göre sıralanmış yaklaşık bir milyon diziden oluşur

2) Her bir dizinin boyutu farklı olabilir ve dizinin içerdiği işlem sayısına bağlıdır.

3) Ortalama olarak bir dizinin boyutu 20/10^6 = 20 Mb'dir, bir diziyi tamamen indireceğimizi garanti edebilir miyiz?

4) K katsayısı yalnızca belirli bir sıradaki işlemlere bağlıdır.

5) Her dizi için K (toplam puan 10^6 parça) bulmalı ve ilk 10'u seçmeliyiz.

Ve diziler arasındaki mesafelerin değerleriyle başka bir dosya oluşturursanız.

1) Kaç tane dizi indirip aralarındaki mesafeyi toplayabileceğimize bakarız (toplamların ara değerlerini koruyarak)

2) Bu mesafeyi dosyadan RAM'e okuyoruz

3) Her dizi için K arama algoritmasını çalıştırıyoruz (1. adımda hesaplanan alt toplamları kaydettiğimiz için dizilerin başlangıcının nerede olduğunu biliyoruz)

4) başlangıç noktası 1'i tekrar biraz ileriye doğru hareket ettirin

İlk 10'a gelince:

n - K'nin toplam değerleri, m - en iyinin sayısı.

1) tüm K'yi daha sonra, yığın veri yapısını kullanarak, en iyilerinden gerekli sayıda seçin (Yığın O (n), en iyi O'yu (log n) seçme sayısı m, bellek alanı - n)

2) hemen gerekli sayıyı hesaplayın - m adet (örneğin, 10), bunları sıralayın ve kalan K'nin ekleme noktasını aramak için ikili aramayı kullanın.

(birincil sıralama O(m*log m), ekleme arama O(log m) kez sayısı (nm), ekleme O(1), bellek alanı - m)

 
Urain :
Önbellek sınırı aşıldığında bu tür boyutlarda özyineleme düşecektir.
Klasik özyineleme ile önbellek boyutu sabittir.
 
ALXIMIKS :

3) Ortalama olarak bir dizinin boyutu 20/10^6 = 20 Mb'dir, tam bir dizi indireceğimizi garanti edebilir miyiz?

Bu arada, evet, dizi paketlerini hemen indirebilirsiniz.
 

Genel olarak özü, gerekli olanı ve verileni yakalayamadığımı hissediyorum (((

  А потом "нужная дата" сдвигается на точку закрытия сделки из выбранной последовательности и алгоритм повторяется.

ve evet 20/10^6 = 20 kb çünkü 1gb = 1000 mb = 10^6 kb

 
YuraZ :

SQL'e doğru gidersek


  • Benim için nispeten yeni bir ortam (sıkı çalışmadı, yalnızca temel sorgular);

Bu, geliştirme aşamasında oldukça yavaş olabilir.

Bu seçeneği seçerseniz, tüm iş mantığını saklı yordamlarla oluşturmak daha iyidir.

sunucuya bir istek göndermek ve tamamen hazır bir sonuç almak için uzmana yalnızca iki işlev bırakarak

sunucudaki tüm hesaplamalar

  • Tek bir istemci makinede kurulumun karmaşıklığı (bağımsız sürüm);

Aslında, internette bir SQL sunucusunun nasıl kurulacağına dair birçok açıklama bulabilirsiniz.

( ORACL,SYBASE + CENTOS örneğin ) ORACL,SYBASE,MS SQL+WINDOWS ayrı makine

ORACL - öğrenmesi biraz daha zor - daha az uzman, daha az literatür

MS SQL - belki de web'deki en fazla bilgi ve daha fazla literatür

belirli bir zorluk olmayacak - internette mağazada çok fazla açıklama var daha fazla kitap var

MSSQL 2012, parametrelerinde ORACL'e yaklaştı - zaten 2014 var

SQL + LINUX paketinin seçimi genellikle endüstriyel operasyonda seçilir - ve LINUX bilgisi yoksa, WINDOWS almak daha iyidir

MSSQL Expres topu ancak limitler 1 çekirdek, 1 GB bellek ve 10 GB taban kullanır

geri kalanı ödenir.

 
komposter :
...

Pek çok benzer işlem dizisi vardır, her bir dizi zamana göre sıralanmıştır.

Farklı dizilerdeki işlemler farklıdır, zaman içinde (ve her dizide kendi yolunda) eşit olmayan bir şekilde dağıtılır. İşlemler değişiklik gösterir. Ancak her şey Date1'den Date2'ye kadar olan aralıktadır.

Görev, D1'den D2'ye M dakikalık bir adımla (veya daha iyisi, özellikle tüm dizilerin işlem noktalarına göre) geçmek, K kriterine göre diğerlerinden daha iyi bir dizi bulmaktır (ayrı bir görev sadece en iyi diziyi bulmak için, ancak tüm seti kritere göre sıralamak ve ilk 10'u görüntülemek için - ancak bu isteğe bağlıdır, henüz gerekli değildir).

...

Nerede olduğunu anlamıyorum.

İşte bir kriter - her şey - Tarih1'den Tarih2'ye kadar olan aralıkta.

kompost :

O gibi.

Ardından "gerekli tarih", seçilen diziden işlemin kapanış noktasına kaydırılır ve algoritma tekrarlanır.

Ve böylece bir milyon kez daha =)

Yani, aşağıdakiler okunur.

Dosyayı neden Date1'den Date2'ye kadar birçok aralığa bölmüyorsunuz? Kapatılabilecek diziler üzerinde çalışılacak mı?

 
Silent :

Nerede olduğunu anlamıyorum.

İşte bir kriter - her şey - Tarih1'den Tarih2'ye kadar olan aralıkta.

Yani, aşağıdakiler okunur.

Dosyayı neden Date1'den Date2'ye kadar birçok aralığa bölmüyorsunuz? Kapatılabilecek diziler üzerinde çalışılacak mı?

Görünüşe göre tek bir tarih geçişinin sonuçlarından biri yeni bir tarih.
 

görev ise:

verilen satır 1 2 3 4 5 6 7 8 9

bir genişlik verildiğinde, örneğin 4, genişlik içinde bir değer (örneğin, bir minimum) bulmak için tüm satır boyunca bu genişlikle hareket etmeniz gerekir:

önce 1 2 3 4 sonra 2 3 4 5 sonra 3 4 5 6 sonra 4 5 6 7 sonra .... vb. bulmanız gerekir.

daha sonra sorun, kuyruk veri yapısında bir minimum tutularak çözülür:

1) bunun mail.ru video kurslarında uygulanmasının dört yığın veri yapısı aracılığıyla yapılması önerildi.

2) Kuyruk veri yapısı ve güverte veri yapısı aracılığıyla sözlü olarak bir uygulama buldum, büyük olasılıkla biri bunu zaten yaptı ve onun adını aldı, sadece onu bulmanız gerekiyor.