Harika bir teorik örnek! Uygulamada, kim-ne zaman-iş parçacığı binlerce işlemle çalıştı?
ps Bunun saçmalık olduğunu ve kimsenin bir şeye ihtiyacı olmadığını kanıtlamaya çalışmıyorum. Gerçek ticaretin değerini anlamaya çalışıyorum. Ben kesinlikle bir teorisyen değilim, saf bir uygulayıcıyım.
Bu yaklaşık 1000 veya sadece 10 işlem değil. İşin püf noktası, hem 10 hem de 1000000 ..... işlemle eşit derecede etkili çalışan bir kısa kod yazmamızdır.
template<typename TKey,typename TValue>
class CHashMap: public IMap<TKey,TValue>
{
protected :
int m_buckets[];
Entry<TKey,TValue>m_entries[];
int m_count;
int m_free_list;
int m_free_count;
IEqualityComparer<TKey>*m_comparer;
bool m_delete_comparer;
.................................
.................................
}
Öncelikle Entry<TKey,TValue>' nin ne olduğunu anlamanız gerekir. Aslında, bu, aşağıdakileri içeren CLinkedList'teki gibi bir Düğümdür:
- bir anahtar ve değer kabına yerleştirilir - anahtar için önbelleğe alınmış karma değer - hash_code - sonraki - çarpışmaları tek başına bağlantılı bir liste yoluyla çözmek için bir sonraki <TKey,TValue> Girişine "işaretçi"
m_entries[] - sonra eklenen anahtar ve değerin, hash_code'un yerleştirildiği bir "hücre" dizisi. Dizinin boyutu Kapasiteye karşılık gelir. m_count - m_entries içindeki ilk kullanılmayan hücrenin dizinini gösterir. Başlangıç değeri 0'dır, Kapasite'ye kadar büyür, ardından tüm diziler Kapasite ve tüm dizilerin boyutunda bir artışla yeniden oluşturulur. m_buckets[] - m_entries[] üzerindeki dizin dizisi. Varsayılan değer -1'dir. Dizinin boyutu Kapasiteye karşılık gelir.
Çarpışma yok, CHashMap kapsayıcısına benzersiz bir değer ekliyor:
Anahtarla hash'i hesaplıyoruz, hash_code alıyoruz
Anahtar, değer, hash_code değerlerini m_count dizininde m_entries[] içine yerleştiriyoruz. (sonraki = -1 çünkü örnekte çarpışma yok)
m_buckets[] dizinine hash_code % (ArraySize(m_buckets)) dizinine yeni eklenen öğenin m_entries[] dizin değerini koyduk (bu m_count'tur).
m_count değerini +1 artırıyoruz
Çarpışma yok, CHashMap kapsayıcısında anahtara göre değer alıyor:
Anahtarla hash'i hesaplıyoruz, hash_code alıyoruz
m_buckets[] dizininden hash_code % (ArraySize(m_buckets)) dizininden m_entries[] dizisinden bir dizin olan bir değer alırız
Elde edilen indeks m_buckets[hash_code % (ArraySize(m_buckets))] tarafından m_entries[] dizisinden değer değerimizi alırız.
Çarpışma çözünürlüğü:
Farklı anahtarlar için hash_code_key_1 % (ArraySize(m_buckets)), hash_code_key_2 % (ArraySize(m_buckets)) değerine eşit olacaktır. Buna çarpışma denir. Bir çarpışma ile m_entries[] öğesine eklenen tüm öğeler, next aracılığıyla tek başına bağlantılı bir listeyle birbirine bağlanır (bkz. Entry<TKey,TValue> yapısı) Ve m_buckets[] her zaman bu çarpışma listesindeki ilk head öğesinin dizinine işaret eder. Çarpışmalı büyük bir liste değil, birçok küçük liste ortaya çıkıyor.
Çarpışma, CHashMap kapsayıcısında anahtara göre değer alma:
Anahtarla hash'i hesaplıyoruz, hash_code alıyoruz
m_buckets[] dizininden hash_code % (ArraySize(m_buckets)) dizininden m_entries[] dizisinden bir dizin olan bir değer alırız
Bir sonraki değerin -1'e eşit olmadığını görüyoruz, bu da bir çarpışmanın varlığını gösterir.
Tek tek bağlantılı bir m_entries[] öğeleri listesinden geçiyoruz ve eşitlik için istenen değeri kaydedilmiş anahtarlarla karşılaştırıyoruz
Bir CHashMap kapsayıcısından bir değeri kaldırma:
- m_entries[] içindeki bir hücreyi silerken hiçbir silme gerçekleşmez, hücre serbest olarak belirtilir ve hash_code = -1 olur. - serbest hücreler kendi serbest hücre listelerini oluştururlar (Entry<TKey,TValue>'den sonraki ile aynı), m_free_list liste baş indeksinden sorumludur - Container'a yeni değerler eklendiğinde ilk olarak serbest hücreler kullanılır. - m_free_count , mevcut boş hücre sayısını kontrol etmek için kullanılır
Hash tablosunu yeniden oluşturma (Kapasite artırma süreci):
- yeniden oluşturma yalnızca Kapasite %100 dolu olduğunda gerçekleşir. - aşağıdaki Kapasite listeden alınmıştır:
- m_entries[] ve m_buckets[] dizilerinin boyutları artar. - m_buckets[] temizlenir ve m_entries[]'den alınan verilere göre tamamen yeniden doldurulur (anahtar - hash_code için önbelleğe alınmış karma değer)
CHashMap uygulamasıyla tanıştım Dürüst olmak gerekirse, beğendim.
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.
Algoritma tarafından hft siparişleri göndermek ve daha sonra bunları analiz için almak iki farklı şeydir. Bu karmalar, daha sonra tamamen farklı bir şey analiz edildiğinden, analiz için de gönderme için gerekli değildir.
Algoritma tarafından hft siparişleri göndermek ve daha sonra bunları analiz için almak iki farklı şeydir. Bu karmalar, daha sonra tamamen farklı bir şey analiz edildiğinden, analiz için de gönderme için gerekli değildir.
Genelde suç yok. Teori de gereklidir.
Bulaşık makinesi kullanmıyorum, süngerim var. Genelde suç yok. Bulaşık makineleri gallimdir, neden sadece ihtiyaç duyulur.
Algoritma tarafından hft siparişleri göndermek ve daha sonra bunları analiz için almak iki farklı şeydir. Bu karmalar, daha sonra tamamen farklı bir şey analiz edildiğinden, analiz için de gönderme için gerekli değildir.
Genelde suç yok. Teori de gereklidir.
Ne şikayetleri? Koltuk değneklerini daha fazla yaz.
Ne şikayetleri? Koltuk değneklerini daha fazla yaz.
İşin aslı, burada önerilen konuyu kullanmıyorum ve haklı olup olmadığımı anlamaya çalışıyorum. Yeterince sıradan ilişkisel dizim var ama her zaman daha iyi olmak istiyorum.
//+------------------------------------------------------------------+//| Gets the element at the specified index. |//+------------------------------------------------------------------+template < typename T>
bool CArrayList::TryGetValue( constint index,T &value) const
Harika bir teorik örnek! Uygulamada, kim-ne zaman-iş parçacığı binlerce işlemle çalıştı?
ps Bunun saçmalık olduğunu ve kimsenin bir şeye ihtiyacı olmadığını kanıtlamaya çalışmıyorum. Gerçek ticaretin değerini anlamaya çalışıyorum. Ben kesinlikle bir teorisyen değilim, saf bir uygulayıcıyım.
CHashMap'in mevcut uygulaması hakkında kısaca:
Öncelikle Entry<TKey,TValue>' nin ne olduğunu anlamanız gerekir.
Aslında, bu, aşağıdakileri içeren CLinkedList'teki gibi bir Düğümdür:
m_entries[] - sonra eklenen anahtar ve değerin, hash_code'un yerleştirildiği bir "hücre" dizisi. Dizinin boyutu Kapasiteye karşılık gelir.
m_count - m_entries içindeki ilk kullanılmayan hücrenin dizinini gösterir. Başlangıç değeri 0'dır, Kapasite'ye kadar büyür, ardından tüm diziler Kapasite ve tüm dizilerin boyutunda bir artışla yeniden oluşturulur.
m_buckets[] - m_entries[] üzerindeki dizin dizisi. Varsayılan değer -1'dir. Dizinin boyutu Kapasiteye karşılık gelir.
Çarpışma yok, CHashMap kapsayıcısına benzersiz bir değer ekliyor:
Çarpışma yok, CHashMap kapsayıcısında anahtara göre değer alıyor:
Çarpışma çözünürlüğü:
Çarpışma, CHashMap kapsayıcısında anahtara göre değer alma:
Bir CHashMap kapsayıcısından bir değeri kaldırma:
Hash tablosunu yeniden oluşturma (Kapasite artırma süreci):
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
CHashMap uygulamasıyla tanıştım
Dürüst olmak gerekirse, beğendim.
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.
Uygulamada, kim-ne zaman-iş parçacığı binlerce işlemle çalıştı?
Evet, birçok insan tek geçişte tarihe milyonlarca gönderme yapıyor.
Kalelerde, her ilk.
Temiz.
Algoritma tarafından hft siparişleri göndermek ve daha sonra bunları analiz için almak iki farklı şeydir. Bu karmalar, daha sonra tamamen farklı bir şey analiz edildiğinden, analiz için de gönderme için gerekli değildir.
Genelde suç yok. Teori de gereklidir.
Temiz.
Algoritma tarafından hft siparişleri göndermek ve daha sonra bunları analiz için almak iki farklı şeydir. Bu karmalar, daha sonra tamamen farklı bir şey analiz edildiğinden, analiz için de gönderme için gerekli değildir.
Genelde suç yok. Teori de gereklidir.
Bulaşık makinesi kullanmıyorum, süngerim var.
Genelde suç yok. Bulaşık makineleri gallimdir, neden sadece ihtiyaç duyulur.
Temiz.
Algoritma tarafından hft siparişleri göndermek ve daha sonra bunları analiz için almak iki farklı şeydir. Bu karmalar, daha sonra tamamen farklı bir şey analiz edildiğinden, analiz için de gönderme için gerekli değildir.
Genelde suç yok. Teori de gereklidir.
Ne şikayetleri? Koltuk değneklerini daha fazla yaz.
Kısaca CHashMap'in mevcut uygulaması hakkında
Teşekkürler, kaynakları ayrıştırırken kullanacağım.
Ne şikayetleri? Koltuk değneklerini daha fazla yaz.
Teşekkürler, kaynakları ayrıştırırken kullanacağım.
Yeni bir anahtar/değer çifti eklerken kapta bir anahtarın varlığının kontrolünü atladım, önce bu yapılır.
Ama önemli değil.
Lütfen bunu tüm Genel'de düzeltin.