Genel sınıflar kütüphanesi - hatalar, açıklamalar, sorular, kullanım özellikleri ve öneriler - sayfa 18
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Bunu başlattı
ve anladım
CarrayList, karma değişkenden daha hızlıdır. CArrayList'in iç kısımlarına tırmandı ve hemen orada
Şimdi aldatılmış hissediyorum. CArrayList'in sıradan bir dizi etrafındaki sarmalayıcı olduğu ortaya çıktı. Önceki / Sonraki işaretçileriyle normal bir liste olduğunu düşündüm, ama işte burada
Yapılarla çalışmak için gerçek algoritmalara ek olarak, görevin özelliklerine göre doğru kapsayıcıyı seçme sorunu da vardır.
Yani aynı arayüz farklı uygulamalar için olabilir. Arayüzden değil, belirli uygulamadan - bir diziden - biraz hayal kırıklığı yaşadım. Karma ile karşılaştırıldığında - cennet ve dünya.
Şimdi aldatılmış hissediyorum. CArrayList'in sıradan bir dizi etrafındaki sarmalayıcı olduğu ortaya çıktı. Önceki / Sonraki işaretçileriyle normal bir liste olduğunu düşündüm, ama işte burada
Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum
Algoritmalar, karar yöntemleri, performanslarının karşılaştırılması
Sergey Dzyublik , 2017.12.10 20:52
Ne DBMS, veri yapılarında SIFIR'ı anlayan bir kişiye ne ovuşturuyorsunuz.
Böyle bir ArrayList (C++ 'dan vektör) kavramı yoksa ne hakkında konuşabiliriz .....
Daha çok senin dikkatsizliğin...
Mevcut tüm listeye göz atın - https://www.mql5.com/en/docs/standardlibrary/generic
CArrayList, C++'daki std::vector'a benzer
CLinkedList büyük olasılıkla C++'dan std::list'in bir analoğudur
Bunu başlattı
ve anladım
CarrayList, karma değişkenden daha hızlıdır. CArrayList'in iç kısımlarına tırmandı ve hemen orada
Şimdi aldatılmış hissediyorum. CArrayList'in sıradan bir dizi etrafındaki sarmalayıcı olduğu ortaya çıktı. Önceki / Sonraki işaretçileriyle normal bir liste olduğunu düşündüm, ama işte burada
Tarihsel olarak, Liste bir sayfa değil, bir dizidir. Bu nedenle, her şey doğru. Bir sayfa genel olarak görünüyorsa, büyük olasılıkla LinkedList veya bunun gibi bir şey olarak adlandırılacaktır.
Arayüzden değil, belirli uygulamadan - bir diziden - biraz hayal kırıklığı yaşadım.
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
Sergey Dzyublik , 2017.12.09 01:12
Olası iyileştirme için birkaç öneri var:
1) Benim düşünceme göre, uygulama tamamen doğru olmayan bir kapasite seçimi içeriyor - hem ilk boyut 3 hem de hash tablosu yeniden oluşturulduğunda sonrakiler.
Evet, doğru, düzgün dağılım için bir asal sayı seçmeniz gerekiyor.
Ancak, CPrimeGenerator uygulaması beklentileri karşılamıyor ve eksik asal sayılar içeriyor.
Böyle bir "jeneratörün" amacı açıktır - otomatik asal sayılar oluşturma ile 1.2 mertebesinde bir büyüme faktörü sağlamak.
Ancak, bu çok küçük bir faktör değil mi? Vektörler için C++'da katsayı genellikle kitaplığa bağlı olarak 1.5-2.0'dır (çünkü işlemin ortalama karmaşıklığını büyük ölçüde etkiler).
Çıktı sabit bir katsayı olabilir, ardından bir asal sayılar listesinde ikili arama yoluyla sayı bir asal sayıya yuvarlanabilir .
Ve başlangıçtaki kapasite boyutu 3 çok küçük, geçen yüzyılda yaşamıyoruz.
2) Şu anda, karma tablosunun yeniden oluşturulması (Yeniden boyutlandırma) yalnızca %100 doldurma kapasitesi ile gerçekleştirilmektedir (tüm m_entries[] doldurularak)
Bu bağlamda, çok düzgün dağılıma sahip olmayan anahtarlar için önemli sayıda çarpışma mümkündür.
Bir seçenek olarak, karma tablo yeniden oluşturma işlemini gerçekleştirmek için gereken sınıra göre %100 azaltacak bir doldurma faktörü eklemeyi düşünün.
1) Hacim büyüme katsayısı (kapasite) 1.2'ye eşit değildir, CHashMap'te yeni hacmi hesaplamak için CPrimeGenerator::ExpandPrime yöntemi kullanılır:
Bu yöntemde, koleksiyonun eski boyutu iki ile çarpılır, ardından ortaya çıkan değer için üstten en yakın asal sayıyı bulup yeni hacim olarak döndürürüz.
Kapasitenin başlangıç değeri hakkında - Katılıyorum, çok küçük.
Ancak diğer yandan, başlangıç hacmini açıkça belirtebileceğiniz yapıcılar her zaman vardır:
Bu nedenle, burada bir şeyi değiştirmenin pek bir anlamı görmüyorum.
2) Doldurma faktörü parametresini eklemek gerçekten de bazı durumlarda çarpışmaları önlemeye yardımcı olacaktır. Büyük ihtimalle uygulanacaktır.
1) Hacim büyüme katsayısı (kapasite) 1.2'ye eşit değildir, CHashMap'te yeni hacmi hesaplamak için CPrimeGenerator::ExpandPrime yöntemi kullanılır:
Bu yöntemde, koleksiyonun eski boyutu iki ile çarpılır, ardından ortaya çıkan değer için üstten en yakın asal sayıyı bulup yeni hacim olarak döndürürüz.
Kapasitenin başlangıç değeri hakkında - Katılıyorum, çok küçük.
Ancak diğer yandan, başlangıç hacmini açıkça belirtebileceğiniz yapıcılar her zaman vardır:
Bu nedenle, burada bir şeyi değiştirmenin pek bir anlamı görmüyorum.
2) Doldurma faktörü parametresini eklemek gerçekten de bazı durumlarda çarpışmaları önlemeye yardımcı olacaktır. Büyük ihtimalle uygulanacaktır.
Roman, bunu orada yaptığını sanmıyorum. Şimdi bazı genel sınıflar en gerekli yöntemleri bile içermiyor. Onları hiç denedin mi? Örneğin, kırmızı-siyah bir ağacın klasik bir uygulaması olan CRedBlackTree'yi ele alalım. Oldukça havalı bir algoritma, ancak yineleme olasılığı olmadan. Bu nasıl anlaşılmalı? İhtiyaç duyulan başka birçok şey var, ama nedense kimse uygulamaya zahmet etmedi. Aynı GetHashCode genellikle korkunçtur. Üzgünüm ama bu MQ seviyesi değil!
Roman, bunu orada yaptığını sanmıyorum. Şimdi bazı genel sınıflar en gerekli yöntemleri bile içermiyor. Onları hiç denedin mi? Örneğin, kırmızı-siyah bir ağacın klasik bir uygulaması olan CRedBlackTree'yi ele alalım. Oldukça havalı bir algoritma, ancak yineleme olasılığı olmadan. Bu nasıl anlaşılmalı? İhtiyaç duyulan başka birçok şey var, ama nedense kimse uygulamaya zahmet etmedi. Aynı GetHashCode genellikle korkunçtur. Üzgünüm ama bu MQ seviyesi değil!
Genric kitaplığındaki tüm şablon koleksiyonları için yineleyicilere olan ihtiyacı çok iyi anlıyorum, ancak iç içe sınıflar ve arabirimlerden çoklu kalıtım oluşturma yeteneği olmadan, bunları doğru şekilde uygulamak işe yaramaz.
GetHashCode ile ilgili olarak, daha spesifik yorumlar duymak istiyorum.
...
GetHashCode ile ilgili olarak, daha spesifik yorumlar duymak istiyorum.
Sorun
Açıkçası, GetHashCode, MQL5 kullanıcı ortamında düzgün bir şekilde uygulanamaz. Bunun nedeni, tüm nesnelere erişilememesidir. Ve eğer double int, vb. Gibi ilkel üyelerde ise. uygulama iyi çalışıyor, daha sonra karmaşık nesneler (sınıflar, yapılar ve hatta numaralandırmalar) için karma ada göre hesaplanır. Açıkçası, CObject türünde veya hatta ENUM _something_there türünde bin nesnemiz varsa, o zaman hem CHashMap hem de CHashSet normal bir LinkedList'e dönüşür:
Bundan kaçınmanın bir yolu yok, çünkü kullanıcı düzeyinde sahip olduğumuz tek şey nesnenin adı:
Bu nedenle, karmaşık türlerdeki tüm nesnelerin karma değerleri birbirine eşittir ve bu arama kodu, dizinin tam bir aramasını kullanır:
Aslında, bu o kadar kritik ki, tüm Jenerik'i tomurcukta kullanma noktasını aşıyor. Gerçek şu ki, çoğu durumda karmaşık nesnelerin ilişkilendirilmesi veya depolanması gerekir: numaralandırmalar, yapılar veya sınıflar. Yalnızca basit tiplerin çalıştırılması gerekseydi, daha basit bir şey yapılabilirdi.
Karar
Açıkçası, MQL5, dahili bir sanal makinede çalışan, güvenli bir özel programlama dilidir. Net gibi bir şey. Bu, nesnelere gerekli erişimin hala orada olduğu, ancak daha sistematik bir düzeyde olduğu anlamına gelir. Bu nedenle, aşağıdaki prototiple bir GetHashCode sistem işlevi yazmak mümkündür :
Nasıl çalışmalı? İlk olarak, omnivordur ve hızlı olmalıdır. Eşit bir dağıtım yapın. Örneğin:
Bu fonksiyon, sistem fonksiyonları bölümünde bulunabilir. Başka çözümler göremiyorum.
ps Biraz sonra arayüzler, çoklu kalıtım ve diğer C++ mirası hakkında başka önerilerde bulunacağım.