Genel sınıflar kütüphanesi - hatalar, açıklamalar, sorular, kullanım özellikleri ve öneriler - sayfa 8

 

İşte giriş alanıyla birlikte kod. (Belki birileri işine yarar. Düzeltebilirsin).

 //+------------------------------------------------------------------+
//|                                                   Dictionary.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link        ""
#property version    "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
#define Max_possible_collisions     100
#define Max_letters_in_word         100
#define All_letters_in_alphabet     255 
//------------------------------------
string Dictionary[Max_possible_collisions][All_letters_in_alphabet][Max_letters_in_word];
//-------------------------------------------------------------------
int OnInit ()
  {
//---
   Create_text_box();
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   ObjectDelete ( 0 , "Text_box" );
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent ( const int id,
                   const long &lparam,
                   const double &dparam,
                   const string &sparam)
  {
     if (id == CHARTEVENT_OBJECT_ENDEDIT )
      { 
       //-----------------------
       string Text;     
       //---------------------
       ObjectGetString ( 0 , "Text_box" , OBJPROP_TEXT , 0 ,Text);
       //-------------------------------------
       Add(Text);
      } 
  }
//+------------------------------------------------------------------+

void Add( string word)
{
 uchar First_letter = ( uchar ) StringGetCharacter (word, 0 ) - 97 ;
 //-----------------------
 int All_letters_in_word = StringLen (word);
 //-----------------------
 for ( int a1 = 0 ; a1 < Max_possible_collisions; a1++)
   {
     string word_inside = Dictionary[a1][First_letter][All_letters_in_word];
     //-----------------------   
     if (word_inside == NULL )
      {
       Dictionary[a1][First_letter][All_letters_in_word] = word;
       Print ( "Your word has been added to our dictionary!" );
       break ;
      }
     if (word_inside == word)
      {
       Print ( "This word already exists in our dictionary" );
       break ;
      } 
   }   
 //------------------------   
}
//--------------------------------------------------------------------+


//--------------------------------------------------------------------
void Create_text_box()
{
   ObjectCreate ( 0 , "Text_box" , OBJ_EDIT , 0 , 0 , 0 );
   ObjectSetInteger ( 0 , "Text_box" , OBJPROP_XDISTANCE , 500 );
   ObjectSetInteger ( 0 , "Text_box" , OBJPROP_YDISTANCE , 250 );
   ObjectSetInteger ( 0 , "Text_box" , OBJPROP_XSIZE , 400 );
   ObjectSetInteger ( 0 , "Text_box" , OBJPROP_YSIZE , 30 );
   ObjectSetString ( 0 , "Text_box" , OBJPROP_TEXT , "Please enter your word here..." );
   ObjectSetString ( 0 , "Text_box" , OBJPROP_FONT , "TimesNewRoman" );
   ObjectSetInteger ( 0 , "Text_box" , OBJPROP_STATE , 1 );
   //----------------------------------------------
   ObjectSetInteger ( 0 , "Text_box" , OBJPROP_FONTSIZE , 12 );
   ObjectSetInteger ( 0 , "Text_box" , OBJPROP_BGCOLOR , clrWhite );
   ObjectSetInteger ( 0 , "Text_box" , OBJPROP_COLOR , clrBlack );
   ObjectSetInteger ( 0 , "Text_box" , OBJPROP_BORDER_COLOR , clrBlack );
   ObjectSetInteger ( 0 , "Text_box" , OBJPROP_ALIGN , ALIGN_CENTER );
   //----------------------------------------------
   ObjectSetInteger ( 0 , "Text_box" , OBJPROP_CORNER , CORNER_LEFT_UPPER );
   ObjectSetInteger ( 0 , "Text_box" , OBJPROP_ANCHOR , ANCHOR_LEFT_UPPER );  
   //---------------------------------------------- 
}
//----------------------------------------------------------------------- 

Sadece bir nedenden dolayı dördü üzerinde tamamen çalışıyor. Beşte, alan görünmez. Nedenini aradım ve bulamadım.

 
fxsaber :

Onlar. her görev için sözlüğün boyutu (RAM) ile karma işlevinin (CPU) hesaplama karmaşıklığı arasında bir orta yol bulmanız gerekir.


Nispeten evet.
Küçük eleman değerleri için, en uygun sözlük elemanların karesi sayısı olacaktır (3 yıl önceki dersten hatırladığım kadarıyla, ancak her zaman iki kez kontrol etmek daha iyidir).
Çok sayıda öğe nedeniyle en uygun boyutu seçmek mümkün olmadığında, sözlük boyutu beklenen öğe sayısından birkaç kat daha büyük alınır ve örneğin çarpışmaların her biri için dahili karma tabloları aracılığıyla çarpışma çözünürlüğü optimize edilir. .

Karmayı olabildiğince çabuk aranacak şekilde seçmeye çalışırlar, ancak elde edilen sonuçların sözlüğün boyutuna göre düzgün dağılımını sağlarlar.
Dağılımın tekdüzeliği, hash'lerde asal sayıların kullanımı ile ilgilidir.

 
Peter Konow'un fotoğrafı.
Büyük harfler farklı bir koda sahip olduğundan ve dizinin "bırakılmasından" dolayı dizinin boyutunu artırmak zorunda kaldım.

"A" karakterinin kodu, "a" karakterinin kodundan tam olarak 32 farklıdır. Buna göre, diğerlerinin hepsinde de 32 fark vardır.

Belki dizinin boyutunu büyütmek gerekli değildi, sadece ilk karakteri değiştirmek yeterliydi.
 
Alexey Viktorov :

"A" karakterinin kodu, "a" karakterinin kodundan tam olarak 32 farklıdır. Buna göre, diğerlerinin hepsinde de 32 fark vardır.

Belki dizinin boyutunu büyütmek gerekli değildi, sadece ilk karakteri değiştirmek yeterliydi.

Kabul ediyorum. Bu algoritma iyi gelişmemiştir.

Dizi boyutu çok büyük. Dün, harflerin kodlarını tam olarak anlamadım.

 
Peter Konow'un fotoğrafı.

İşte giriş alanıyla birlikte kod. (Belki birileri işine yarar. Düzeltebilirsin).

Sadece bir nedenden dolayı dördü üzerinde tamamen çalışıyor. Beşte, alan görünmez. Nedenini aradım ve bulamadım.

Ve bir not daha: Vasily'nin örneğinde, bir diziden söz edilir.

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Genel sınıf kitaplığı - hatalar, açıklama, sorular, kullanım ve öneriler

Vasiliy Sokolov , 2017.12.07 14:30

1 numaralı ilişkisel dizi hakkında mümkün olduğunca basit

Generic'te sunulan algoritmaların çoğu, şu veya bu şekilde bir ilişkisel dizi veya sözlüğe dayanmaktadır. Ayrıca en sık kullanılan iki algoritmadan biridir. Programlamadaki tüm görevlerin %90'ının diziler ve sözlükler tarafından kapsandığını söylersem gerçeğe yakın olacağımı düşünüyorum. Uygulamaya geçmeden önce, bazı detayları kasıtlı olarak basitleştirerek, sözlüğün çalışmasını mümkün olduğunca basit ve anlaşılır bir şekilde anlatacağız.

Sözlüğü çok basit bir örnek kullanarak analiz edeceğiz: sıradan bir kelime sözlüğü. Diyelim ki elimizde bu kelimelerden sadece birkaçı var ve hepsi alfabenin farklı harfleriyle başlıyor:

 string words[] = { "apple" , "cat" , "fog" , "dog" , "walk" , "zero" };

İngiliz alfabesi 26 karakter içerir. 26 elemanlı bir dizi dizi oluşturalım:

 string dictionary[ 26 ];

Şimdi, kelimeleri ilk harflerine karşılık gelen dizinlerde saklamayı kabul edersek, en basit sözlüğü elde ederiz. İndekslemeyi sıfırdan yapacağız. "Elma" kelimesi 0 dizininde saklanacaktır, çünkü "a" karakteri alfabenin ilk harfidir, "kedi" - dizin 1'de, "köpek" - dizin 3'te, sis - dizin 4'ü işgal edecektir, yürü - dizin 24 ve sıfır, son 25. dizindir.

5 ile 23 arasındaki dizinlerin kullanılmayacağını unutmayın. Bu ek bellek tüketimi , ancak örneğin "yürümek" kelimesine anında başvurabiliriz, çünkü eğer varsa, o zaman indeks 24'te bulunduğunu biliyoruz.

İlk boş sözlüğümüzü yazalım:



Ve senin örneğinde

 #define Max_possible_collisions     100
#define Max_letters_in_word         100
#define All_letters_in_alphabet     255 
//------------------------------------
string Dictionary[Max_possible_collisions][All_letters_in_alphabet][Max_letters_in_word];

3B dizi ne kadar bellek kaplar? Boyutu artırmanız gerekirse ne olur?

 
Alexey Viktorov :

Ve bir not daha: Vasily'nin örneğinde, bir diziden söz edilir.


Ve senin örneğinde

3B dizi ne kadar bellek kaplar? Boyutu artırmanız gerekirse ne olur?

Dizi boyutu çok büyük çünkü:

1. Bir kelimedeki maksimum harf sayısının 100 olabileceğine karar verdim. Açıkçası aşırıya kaçmış. 30'a düşürülebilir.

2. Olası harflerin sayısının da aşırı olduğu ortaya çıktı. Mümkün olduğu kadar çok farklı karakter için yer ayırmaya karar verdim. Azaltılabilir.

3. "Çarpışma" sayısı, yani bir kelimedeki kelimelerin ilk harfine ve harf sayısına göre eşleşmeleri 100 olarak ayarlanmıştır. Çok fazla. 50'ye düşürülebilir.


Boyutu büyütmenin amacını görmüyorum. Sadece başka bir sözlük yapabilirsin.

 
Peter Konow'un fotoğrafı.

Dizi boyutu çok büyük çünkü:

1. Bir kelimedeki maksimum harf sayısının 100 olabileceğine karar verdim. Açıkçası aşırıya kaçmış. 30'a düşürülebilir.

2. Olası harflerin sayısının da aşırı olduğu ortaya çıktı. Mümkün olduğu kadar çok farklı karaktere yer vermeye karar verdim. Azaltılabilir.

3. "Çarpışma" sayısı, yani kelimelerin ilk harfine ve kelimedeki harf sayısına göre eşleşmeleri 100 olarak ayarlanmıştır. Çok fazla. 50'ye düşürülebilir.


Boyutu büyütmenin amacını görmüyorum. Sadece başka bir sözlük yapabilirsin.

Soru sözlükte yok. Sözlük, bir algoritma oluşturmanın bir örneğidir. Ve örneğinizdeki gibi 100'den çok eleman olabilir, ancak 1e10 veya daha fazla ... Bu durumda dizinin boyutu ne olacak???

Örneğin, mevcut tüm onay geçmişini bir dizide toplayın. Bir milisaniyede birden fazla tik olabilir, bu nedenle dizi tek boyutlu olamaz... ve bir milisaniyede maksimum kaç tik vardı??? iki mi beş mi??? Bu durumda dizinin boyutu ne olmalı??? Ne kadar bellek boşa harcanacak?

 
Alexey Viktorov :

Örneğin, mevcut tüm onay geçmişini bir dizide toplayın.

Tüm bu yazılanlardan sonra, başlıkta tartışılan şekilde keneleri saklamanın pratik bir görevi olmadığını düşündüm. Zamana göre sıralanırlar ve basit bir dizide bulunurlar.

Benzer şekilde Geçmiş Siparişler/Anlaşmalar. Stored, HistorySelect tarafından değerlendirilerek, zamana göre dizide de depolanırlar. Ve orada (mevcut uygulamada) bilet veya kimliğe göre bir kayıt aramak için tartışılan hiçbir şey olmadığını hissediyorum.

Ve hepsi, adlandırılmış tarih söz konusu olduğunda bir şeyi çitle çevirmenin uygun olmadığı için. Pratik yapmak için basit bir dizi yeterlidir.

Bu nedenle, ticaret alanındaki pratik görevlerin formülasyonu ilginçtir.


ZY Siparişte HistorySelect'in hızlandırılması ne zaman oldu, o zaman, eminim ki, bir soruyu hash'li sözlükler değil, önbelleğe alma yoluyla çözdü.

 
fxsaber :

Tüm bu yazılanlardan sonra, başlıkta tartışılan şekilde keneleri saklamanın pratik bir görevi olmadığını düşündüm. Zamana göre sıralanırlar ve basit bir dizide bulunurlar.

Benzer şekilde Geçmiş Siparişler/Anlaşmalar. Depolanmış, HistorySelect'e göre, zamana göre dizide de depolanırlar. Ve orada (mevcut uygulamada) bilet veya kimliğe göre bir kayıt aramak için tartışılan hiçbir şey olmadığını hissediyorum.

Ve hepsi, adlandırılmış tarih söz konusu olduğunda bir şeyi çitle çevirmenin uygun olmadığı için. Pratik yapmak için basit bir dizi yeterlidir.

Bu nedenle, ticaret alanındaki pratik görevlerin formülasyonu ilginçtir .


ZY Siparişte HistorySelect'in hızlandırılması ne zaman oldu, o zaman, eminim ki, bir soruyu hash'li sözlükler değil, önbelleğe alma yoluyla çözdü.

Tartışmıyorum ama birisi bu şekilde bir görevi yerine getirmek istiyorsa bayrak onun elinde...

Birisi bunun anlamsız olduğunu düşünüyor, biri ustalaşamıyor ... Her iki durumda da daha basit uygulamalar var. Ama ticaretin "yarın" nasıl gelişeceğini kim bilebilir... Muhtemelen, yoklukta gereğinden fazla sahipsiz olmak ve sahipsiz kalmak daha iyidir.

 
Alexey Viktorov :

Soru sözlükte yok. Sözlük sadece bir algoritma oluşturmaya bir örnektir. Ve örneğinizdeki gibi 100'den çok eleman olabilir, ancak 1e10 veya daha fazla ... Bu durumda dizinin boyutu ne olacak???

Örneğin, bir dizideki tüm kullanılabilir onay geçmişini toplayın. Bir milisaniyede birden fazla tik olabilir, bu nedenle dizi tek boyutlu olamaz... ve milisaniyede maksimum kaç tik vardı??? iki mi beş mi??? Bu durumda dizinin boyutu ne olmalıdır??? Ne kadar bellek boşa harcanacak?

Uygun bir sözlük oluşturma problemini çözdüm.

Keneler veya diğer öğeler, depolama konumuna hızlı erişim için başarıyla dizine eklenebilen kendi özel özelliklerine sahiptir.

Verilere hızlı erişim görevinin özü, bir öğenin birkaç sınıflandırılmış özelliğini tanımlamak ve bunları indekslemektir.

Bir eleman alınır, indekslerin alınabileceği uygun özellikler bulunur ve indeksler aracılığıyla depolama konumuna erişim sağlanır.

Yeterli indeks yoksa (örneğin, bir kelime için ilk harf ve harf sayısı indekslenebilir, ancak geri kalan özellikler uygun bir indeks sağlamaz), onu çevreleyen alan içindeki öğelerin doğrudan bir sayımını yaparız.

İlke evrenseldir, uygulamalar değişebilir.