은 그래서 당신이 원하는 것은 "독특한 큐"입니다 - 아마도 당신은 더 나은 귀하의 질문의 제목을 바꾸어 말하다 수 이것을 반영하십시오.
O (1) 성능과 비슷한 동작을하는 hash table과 큐처럼 사용할 수있는 doubly linked list을 결합하여 고유 한 큐를 구현할 수 있습니다. 큐에 추가 할 때
typedef struct {
hashtable *set;
linkedlist *queue;
} unique;
, 당신은 첫 번째 항목이 이미 해시 테이블에없는 것을 확인하고, 그렇지 않은 경우에만 해시 테이블과 링크 된 목록에이 추가 않습니다.
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;
}
큐에서 제거, 링크 된 목록에서 해시 테이블에서 모두 항목을 제거 : 이미이 있다면 발신자가 무슨 일이 있었는지 알 수 있도록 당신은 성공 또한에 NULL
을 반환하거나 기존 항목 수 다음과 같이
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
포인터를 사용하여 대기열 순서로 노드를 연결합니다.
파이썬 세트는 FIFO가 아닙니다. – user2357112
파이썬 세트는 수학적 세트와 비슷합니다. 모든 요소는 집합에서 한 번만 발생할 수 있습니다. [추상 데이터 형식으로 세트에 위키 피 디아] (https://en.wikipedia.org/wiki/Set_(abstract_data_type) – UpSampler
@ UpSampler-- 이것은 적절하지 않습니다. '{1, 2, 3, 3}'은 수학적 집합이며 [{1,2,3}} 세트와 동일합니다. (https://en.wikipedia.org/wiki/Set_ (수학) #Describing_sets). –