なんらかの理由で、これを実装する必要があり、libsを使用できません。 マップを高速にするには、まずキーを整数にマップし、その整数を内部キーとして使用します。次にマップを実装します。これは私にマッピング関数を与えます。しかし、文字列キーを使用して内部整数キーを計算すると、別の文字列から同じ整数を取得することがあります。どうすれば問題を解決できますか?Cでの<string、string>の実装
0
A
答えて
5
これは避けることはできません。整数よりも多くの文字列が存在するため、ハッシュの衝突が差し迫っています。ハッシュマップを読み上げる - それは明示的に衝突を考慮に入れたデータ構造であり、それらを回避します。
2
これは衝突として知られていますが、最も簡単なのは、ハッシュマップ内の各バケットを同じハッシュのアイテムのリストにすることです。次に、にを入力するだけで、あなたが探しているアイテムを見つけるまでリストを繰り返し処理するだけで済みます。
3
マップデータ構造と「衝突」は分離できません。あなたの実装を開始した方法は罰金だ、ここにあなたが衝突を処理する方法は次のとおりです。
マップ
- に新しいエントリを追加する
hashcode
keyset[index]
がヌルでない場合- keyset [index]!= key(つまり、文字列を、使用のstrcmp)
index
モジュラスsize of keyset
をインクリメントするために、その後、後藤3
- keyset [index]!= key(つまり、文字列を、使用のstrcmp)
- は
key
用マップ
- 計算
hashcode
から値を取得する - を計算する
index
ashcode(多かれ少なかれindex
=hashcode value
%size of keyset
) keyset[index]
がnullでない場合- キーセット[インデックス]!=キー(つまり場合。文字列に対して、使用のstrcmp)を
index
モジュラスsize of keyset
をインクリメントジャンプ3
- キーセット[インデックス]!=キー(つまり場合。文字列に対して、使用のstrcmp)を
- リターン
entryset[index]
key
のハッシュコードから計算
index
(多かれ少なかれを計算
index
=
hashcode value
%
size of keyset
)
entryset[index]
にvalue
を置きますマップからエントリを削除しているヌルリターンヌル
keyset[index]
場合
key
の場合hashcode
を計算する場合 0ハッシュコードから
- 計算
index
(多かれ少なかれindex
=hashcode value
%size of keyset
) keyset[index]
がnullでない場合- かのキーセット[インデックス]!=キー(すなわち。文字列のため、strcmpのを使用)
index
モジュラスsize of keyset
をインクリメントし、その後、後藤3
- かのキーセット[インデックス]!=キー(すなわち。文字列のため、strcmpのを使用)
- は、あなたが見ることができるように、あなたが機能
int findIndexFromKey(Map *map, char *key);
に3ステップ1を入れて、最も可能
をnullにkeyset[index]
とentryset[index]
を設定もちろん
** EDIT **
行われる作業のため、また、あなたのメートルかどうかを確認する必要があります新しいエントリを追加する前に(またはその間に)pが満杯になっていない場合は、無期限にループします。
関連する問題
- 1. protobuf 3のmap <string、map <string、list <string> >>を実装する方法はありますか?
- 2. java.util.PropertiesがMap <Object、Object>を実装し、Map <String、String>を実装しない理由
- 3. Stringが実装されないのはなぜですか<&String>?
- 4. C++ 11 `std :: string ToString(std :: tuple <Args...>&t)`の実装方法は?
- 5. Map <String、String>クラスとイテレータの使用を実装しているJava
- 6. Guice - 実装がバインドされていない(List <String>)
- 7. `String`クラスのような` Class`の実装
- 8. C++の実装
- 9. C++でのロックフリーキャッシュの実装
- 10. C++でのバブルソートの実装
- 11. C#でのSlowSortの実装
- 12. CでのMVarの実装?
- 13. C#でのファクトリパターンの実装
- 14. CでのECCの実装
- 15. C++でのディスジョイントセットの実装
- 16. C++でのインターフェイスの実装
- 17. C++ 'C String'実装にメモリ割り当ての問題があります
- 18. 一覧<string>は、C#
- 19. generic linklist C++での実装
- 20. C++でのドットプロダクト実装
- 21. C++ 11でhas_equal_operatorの実装
- 22. EDI X12の実装でC#
- 23. C#でのSIFT実装
- 24. HashMap実装でのセグメンテーションフォールトC++
- 25. xmlrpc-cライブラリのC++バージョンで、<map <string、string>のオブジェクトをラップし、返り、取得する方法は?
- 26. C/C++でのマルチスレッドステートマシンの実装
- 27. イテレータ用のstd :: io :: Readを実装するには<Item=String>?
- 28. CプリプロセッサのC++実装
- 29. C++メモリマップファイルの実装
- 30. ゲームツリーのC++実装
同じキーが既に追加されている場合、「新しいエントリを追加する」のループは終了しません。 –
真実、私は今それを修正しています。 –
あなたの削除機能も間違っています - 同じキーを持つ 'key1'と' key2'を追加し、 'key1'を削除すると、' key2'は失われます'get'関数)。 – caf