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

 
Vasili Sokolov :

Farklı kelimeler alfabenin aynı harfiyle başlar. Bir önceki sözlüğümüze "elma" kelimesini koyarsak ve sonra oraya "uygulama" koymaya çalışırsak, ondan hiçbir şey çıkmaz. Dizin 0 zaten elma kelimesi tarafından işgal edilecektir. Bu durumda, bir hash fonksiyonu çarpışmasından söz edilir. Karma işlevimiz çok basittir - kelimenin ilk karakterinin numarasını döndürür, bu nedenle bu işlevdeki çarpışmalar çok sık olacaktır. Aynı harfle başlayan farklı kelimeleri saklamak için bir ekleme yapacağız: elemanları bir dizide değil, bir dizi dizisinde saklayacağız. Ardından, 0 dizininde iki kelime içeren başka bir dizi olacaktır: "elma" ve "uygulama":

Artık sözlüğümüz aynı harfle başlayan kelimeleri bile saklıyor. Ancak ilk harfi aynı olan kelimelere erişim fiyatı artıyor. Çünkü artık 'application' kelimesinin sözlükte olup olmadığını anlamak için 'a' ile başlayan tüm kelimelerin tam olarak aranması gerekiyor. Eğer hash fonksiyonumuz, kelimeler bir karakter ile farklılık gösterse bile farklı sayılar üretseydi, aynı indekse sahip kelimeler üzerinde yineleme olasılığı sıfıra ve rastgele bir öğeye erişim o(1) eğilimine girerdi . Bu tam olarak gerçek sözlüklerde olan şeydir, orada kullanılan fonksiyonlar çarpışmalara karşı dayanıklıdır, bu yüzden kesinlikle bu koleksiyonlardaki öğelere erişimin çok hızlı ve neredeyse numaralandırma olmadan olduğunu söyleyebiliriz.

Çözümümü bu örneğe sunmaya çalışacağım. İşaretçi yok. Biraz sonra.
 

Geçenlerde konuyla ilgili bir kitap okudum. Buna " Gcking Algoritmaları " denir. Her şey örneklerle çok net bir şekilde ifade edilmiştir.

 
Vasili Sokolov :

Aşağıdaki örnekte, aynı harfle başlayan kelimeleri depolayabilmesi için onu iyileştireceğiz.

Şapka ve gereksiz varlıklar şeklinde ayak örtüsü olmadan kısa ve öz yazmak için büyük bir istek.

Örneğin, bu

 bool Contains( string word)
{
   uchar index = ( uchar ) StringGetCharacter (word, 0 )- 97 ;
   return words[index] != NULL ;
}

çok daha açık yazılabilirdi

 bool Contains( string word)
{
   return words[word[ 0 ]- 'a' ] != NULL ;
}


Yine de, MT4/5 için bu kod farklı şekillerde çalışabilir, çünkü. MT4'te dizi NULL değerlerle başlatılır ve MT5'te çöp olabilir.

 
fxsaber :

Şapka ve gereksiz varlıklar şeklinde ayak örtüsü olmadan kısa ve öz yazmak için büyük bir istek.

...


şiddetle KARŞI! Kodun ayrıntılı olarak yazılması arzu edilir. Tüm MQ kodlarına bakın - her yerde "büyük harfler" var. Bu standart.


fxsaber :

...

Yine de, MT4/5 için bu kod farklı şekillerde çalışabilir, çünkü. MT4'te dizi NULL değerlerle başlatılır ve MT5'te çöp olabilir.


Peki ya eski terminal? Kim tembel ve hala yaşlı oturuyor - bunlar sadece onun kişisel sorunları. Bu tür tembellikler yüzünden toplum yavaşlamamalı.

 
Vladimir Karputov :

Tüm MQ kodlarına bakın - her yerde "büyük harfler" var. Bu standart.

Fırında standart, burada kodun% 50'sini kaplayan stil değil, öz önemlidir.

 
fxsaber :

Fırında standart, burada kodun% 50'sini kaplayan stil değil, öz önemlidir.


Forumun ana görevi EĞİTİM'dir. Bu nedenle, kod, standarda mümkün olduğunca yakın genişletilmeli ve anlaşılabilir olmalıdır.

 
Vasili Sokolov :

Bu tam olarak gerçek sözlüklerde olan şeydir, orada kullanılan fonksiyonlar çarpışmalara karşı dayanıklıdır, bu yüzden kesinlikle bu koleksiyonlardaki öğelere erişimin çok hızlı ve neredeyse numaralandırma olmadan olduğunu söyleyebiliriz.

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.

 
Vladimir Karputov :

Forumun ana görevi EĞİTİM'dir. Bu nedenle, kod genişletilmeli ve anlaşılır olmalıdır.

Yeter.

standarda mümkün olduğunca yakın.

Kendi şapkalarınızı takabilirsiniz. A100, SD'de kapaksız yüzlerce rapor yayınladı - standart bu! Çünkü öz önemlidir, tinsel değil.

 
Bir çözüm var. Ancak, entrikayı geçici olarak tutmak için buraya bir yürütülebilir dosya koymak istiyorum. Ayrıca, yetenekli kişiler benim çözümümün performansını ve yukarıdaki yazar tarafından sağlanan çözümü karşılaştıracaktır. Neyin daha hızlı çalıştığını merak ediyorum.
Dosyalar:
Dictionary.ex5  10 kb
 
Peter Konow'un fotoğrafı.
Bir çözüm var. Ancak, entrikayı geçici olarak tutmak için buraya bir yürütülebilir dosya koymak istiyorum. Ayrıca, yetenekli kişiler benim çözümümün performansını ve yukarıdaki yazar tarafından sağlanan çözümü karşılaştıracaktır. Neyin daha hızlı çalıştığını merak ediyorum.
Yürütülebilir dosyayı çalıştırmanız gerekir. Bir giriş alanı görünecektir. Ardından, farklı kelimeler girebilirsiniz. Eşleşmeler varsa, baskı yoluyla kelimenin sözlükte olduğuna dair bir bildirim görüntülenecektir. Kelime yoksa, kelimenin sözlüğe eklendiğine dair bir bildirim görüntülenecektir.