だから、あなたが欲しいのは「ユニークキュー」である - おそらくあなたはより良いにあなたの質問のタイトルを言い替えることができこれを反映する。
hash tableは、O(1)のパフォーマンスで設定された動作を持ち、doubly linked listをキューのように使用できます。
typedef struct {
hashtable *set;
linkedlist *queue;
} unique;
項目がすでにハッシュテーブルではなく、それがない場合にのみ、あなたはハッシュテーブルとリンクリストに追加しないとキュー、あなたの最初のチェックに追加します。呼び出し側が何が起こったかを知っているので、それはすでにあります場合は、成功したほかのNULL
、または既存のアイテムを返すことができます。
void *unique_add(unique *uniq, void *data)
{
void *existing = hashtable_find(uniq->set, data);
if (!existing) {
hashtable_add(uniq->set, data);
linkedlist_add_tail(uniq->queue, data);
}
return existing;
}
キューから削除する場合は、あなたがリンクリストからハッシュテーブルの両方から項目を削除します次のように:
void *unique_remove(unique *uniq)
{
void *data = linkedlist_remove_head(uniq->queue);
if (data) {
hashtable_remove(uniq->set, data);
}
return data;
}
私はhash table in Cとlinked list in Cを書かれているので、あなたはインスピレーションのためのそれらを使用することを歓迎しています。
あなたは、さらにこれ以上行くと、次のように4つのポインタを持っているリンクリストのノードを使用して、ハッシュテーブルとリンクリストキューのハイブリッドであるデータ構造を作ることができる:
struct unique_node {
struct unique_node *next_in_queue;
struct unique_node *next_in_bucket;
struct unique_node *previous_in_queue;
struct unique_node *previous_in_bucket;
};
typedef struct unique_node unique_node;
あなたはその後、実装しハッシュテーブルはnext_in_bucket
とprevious_in_bucket
ポインタを使用してリンクリストとしてバケットを作成すると同時に、next_in_queue
とprevious_in_queue
ポインタを使用してキューの順序でノードを接続します。
PythonセットはFIFOではありません。 – user2357112
Pythonセットは、数学的なセットに似ています。どの要素もセット内で1回しか出現できません。 [抽象データ型としてのセットに関するWikipedia](https://en.wikipedia.org/wiki/Set_(abstract_data_type) – UpSampler
@ UpSampler--これは正しくありません。 '{1、2、3}'は数学的な集合であり、[{1,2,3}}という集合に相当する(https://en.wikipedia.org/wiki/Set_(数学)#Describing_sets)。 –