c 언어 hashtable 예제

해시 테이블은 일반적으로 키가 값에 매핑되는 사전 데이터 형식을 구현하는 데 사용되지만 배열과 달리 키는 정수 0, 1, 2, … 사전 데이터 형식은 AWK, 펄, 파이썬, PHP, Lua 또는 Ruby와 같은 스크립팅 언어에서 흔히 볼 수 있는 기본 데이터 구조입니다. 예를 들어 배열과 같은 구문을 사용하여 액세스 한 사전의 사용을 보여 주는 일부 Python 코드는 배열을 사용하기가 매우 쉽고 만들기가 간단하지만 단점도 있습니다. 이 예제에서는 프로그램이 있고 이 프로그램에서는 모든 사용자를 배열에 유지하려고 한다고 가정해 보겠습니다. 다른 추상 데이터 형식과 마찬가지로 사전 형식의 사용자가 구현 방법을 알 필요가 없다는 개념입니다. 예를 들어 사전을 검색하는 구조체 배열로 구현할 수 있지만 최악의 경우 키를 찾는 데 O(n) 시간이 많이 듭니다. C에서는 사전 조회에 []를 다시 사용할 수 있는 편리함은 없지만(이를 위해 C++가 필요함) 함수를 사용하여 더 많은 타이핑을 통해 동일한 효과를 얻을 수 있습니다. 예를 들어 C에서 추상 사전을 사용하면 다음과 같이 보일 수 있습니다. 예를 들어 m이 256이면 어떻게 되는지 생각해 보십시오. 그러나 나머지 컴퓨팅은 상대적으로 느린 작업이므로 해시 함수를 빠르게 계산하는 것은 어려울 수 있습니다.

다행히도, 우리는 영리하고 더 나은 솔루션을 만들 수 있습니다. 연결된 목록이 하나만 있는 대신 몇 개의 연결된 목록을 가지고 있지 않은 이유는 무엇입니까? 링크된 목록의 배열입니다. 왜 우리는 크기 26의 배열을 하지 않습니다. 그래서 우리는 알파벳의 모든 문자에 대한 고유 한 링크 된 목록을 가질 수 있습니다. 이제 n의 런타임 대신. 우리는 합리적으로 우리의 새로운 실행 시간이 n /26 될 것이라고 말할 수 있습니다. 이제 100만 개의 큰 목록이 있다면 큰 차이가 전혀 없습니다. 그러나 이 예제에서는 간단하게 유지하려고 합니다. 1. 키와 값을 데이터로 사용하여 구조, 데이터(해시 테이블 항목)를 만듭니다. 2. 이제 구조의 배열, 특정 크기의 데이터 (10,이 경우)를 만듭니다.

그러나 배열의 크기는 초기 배열 용량(즉, 이 경우 10)보다 큰 소수로 즉시 업데이트되어야 합니다. 3. 메뉴가 화면에 표시됩니다. 4. 사용자는 메뉴에 주어진 네 가지 선택 중 하나를 선택해야합니다. 5. 첫 번째 선택: 해시 테이블에 항목을 삽입 (a) 입력으로 키를 가져 가라. (b) 지정된 키에 따라 인덱스를 계산합니다. (c) 계산된 배열 인덱스를 찾습니다. (d) 일부 데이터가 있는 경우 키가 이미 존재하는 데이터 키와 일치하는지 확인합니다.

이 경우 해당 값이 업데이트됩니다. 그렇지 않으면 새 데이터를 삽입할 수 없습니다. 6. 2차 선택: 해시 테이블에서 키를 제거 (a) 제거해야 하는 입력으로 키를 가져 가라. (b) 지정된 키에 따라 인덱스를 계산합니다. (c) 계산된 배열 인덱스에서 데이터를 찾습니다. (d) 일부 데이터가 이미 있는 경우 키가 이미 존재하는 데이터 키와 일치하는지 확인합니다. 이 경우 이 키가 삭제됩니다. 그렇지 않은 경우 데이터가 존재하지 않음을 의미합니다. 7. 3번째 선택: 해시 테이블의 크기 (a) 해시 테이블에 새 데이터 항목을 추가할 때마다 크기를 1씩 늘입니다.

(b) 해시 테이블의 크기는 크기 변수 또는 size_of_hashtable() 메서드에 의해 결정될 수 있습니다. 8. 4번째 선택: 해시 테이블 표시 (a) 함수 표시() 해시 테이블 내용을 표시하기 위한 실행. (b) 여기서 for 루프는 i를 반복자로 사용하여 0에서 array_size-1까지 실행됩니다. (c) 루프 내부의 코드는 i를 인덱스로 사용하여 배열의 해당 인덱스에서 각 데이터 항목을 찾는 것으로 구성됩니다. 그것은 우리가 거대한 먼지 폭풍에 있는 것처럼 그리고 당신은 아무것도 볼 수 없습니다 그리고 우리는 우리의 헛간에 도착해야합니다. 우리는 우리의 헛간이 어디 있는지 볼 수 없지만 우리는 해결책을 가지고 있습니다. 거기에 서있는 사람들이 (우리의 노드) 그들은 모두 두 개의 로프 (우리의 포인터)를 들고 있습니다. 각 사람은 하나의 밧줄만 소유하고 있지만 그 밧줄은 다른 사람이 다른 쪽 끝에 들고 있다.