해시를 사용해야 할 때와 배열을 사용하는 것이 더 나을 때를 생각하고 있습니다. 문자열의 경우 해시가 나타내는 실제 개체의 종류는 무엇입니까?해시로 표현할 수있는 실제 사례는 무엇입니까?
답변
가끔은 해시를 "사전"이라고 부릅니다. 그 자체로 좋은 예라고 생각합니다. 대신 정의가 저장 될 것이라고 정확한 숫자 인덱스를 알아 내기 위해 노력
definition['pernicious']
: 당신은 단어의 정의를 검색하려면, 그냥 그런 짓을하는 것이 좋다.
이 답변은 기본적으로 연관 배열을 가리키는 "해시"로 가정합니다.
하나의 변수를 다른 변수와 연관시켜야 할 때. 해시에서 키/값이 될 수있는 것에 대한 "유형 제한"이 없습니다.
나는 잘못된 방향으로 물건을보고 있다고 생각합니다. 해시를 사용해야하는지 여부를 결정하는 객체가 아니라 액세스하는 방식을 결정합니다. 조회 테이블을 사용할 때 해시가 일반적으로 사용됩니다. 객체가 문자열이고 객체가 Dictionary
에 있는지 확인하려는 경우 O (1)을 통해 해당 객체를 찾습니다 (해시가 제대로 작동한다고 가정). 정렬 할 때 시간은 O (logn)가되며, 이는 받아들이지 않을 수 있습니다.
따라서, 해시들은 또한 오브젝트 (암호) 자체를 기억하지 않고 물체를 표현하는 유용한 방법 등
, (hashsets) 설정 사전 (HashMaps을)와 함께 사용하기에 적합하다.
1 대 1지도가 잘 처리되는 데이터가있을 때마다 예를 들어
, 클래스의 성적 :
"존 스미스"=> "B +"
"야곱 Jenkens"=> "C"
등
전화 번호부 - 키 = 이름, 값 = 전화 번호.
나는 또한 오래된 World Book Encyclopedias (실제 책)를 생각해 본다. 각 기사는 하나의 책으로 "해시"됩니다 (고양이는 "C"볼륨에 들어갑니다).
해시에는 많은 용도가 있습니다. 암호화 용도 외에도 빠른 정보 검색에 일반적으로 사용됩니다. 배열을 사용하여 비슷하게 빠른 조회를하려면 배열을 정렬 된 상태로 유지하고 이진 검색을 사용해야합니다. 해시를 사용하면 정렬 할 필요없이 빠른 검색을 얻을 수 있습니다. 이것은 대부분의 스크립팅 언어가 하나의 이름 또는 다른 언어 (해설 등)로 해싱을 구현하는 이유입니다.
일반적으로 해시를 사용하면 빠르게 찾을 수 있습니다. 해시 맵을 사용하면 다른 것을 빠르게 조합 할 수 있습니다. 해시 세트는 물건을 "빠르게"저장합니다.
해시 컨테이너 또는 일반 컨테이너를 사용하는 것이 더 나은지 고려해 볼 때 해시 함수의 복잡성과 비용을 고려하십시오. 해시 값의 추가 크기와 "완벽한"해시를 계산하는 데 필요한 시간 및 해시 함수 충돌의 경우 끝에 1 : 1 비교를 수행하는 데 필요한 시간은 사실 훨씬 적습니다. 그런 다음 적은 수의 연산자를 사용하여 로그 하리 복잡성을 가진 트리 구조를 거쳐 갈 수 있습니다.
내 앱 설정의 '사전'으로 자주 사용합니다.
설정 | 값
데이터베이스 또는 구성 파일에서 내 응용 프로그램에서 사용할 수 있도록 해시 테이블에로드합니다.
잘 작동하고 간단합니다.
지역, 도시 또는 우편 주소와 연결된 우편 번호 일 수 있습니다.
좋은 예는 많은 요소가있는 캐시입니다. a 값 (URL을 말하면 캐시 된 웹 페이지를 찾으려고합니다)을 찾으려는 식별자가 있습니다. 이러한 조회를 가능한 빨리 수행하고 일부 URL이 요청 될 때마다 저장된 모든 페이지를 검색하지 않으려합니다. 해시 테이블은 이와 같은 문제에 대한 훌륭한 데이터 구조입니다.
내가 작성한 실제 사례 중 하나는 지출 보고서를 제출할 때 사람들이 식사 비용을 합산 한 것입니다.
특정 날짜에 얼마나 많은 항목이 존재하는지 알지 못하고 일일 총계를 얻고 지출 보고서의 날짜 범위를 알지 못했습니다. 얼마나 많은 사람들이 많은 변수 (도시, 주말 등)를 얼마나 지출 할 수 있는지에 대한 제한이 있습니다.
해시 테이블은 이것을 처리하기위한 완벽한 도구였습니다. 열쇠는 값이 영수증 금액 (USD로 변환) 인 날짜입니다. 영수증은 순서에 관계없이 올 수 있으며, 그 날짜에 대한 가치를 계속 얻고 작업이 완료 될 때까지 추가합니다. 표시도 쉬웠습니다.
(PHP 코드)
$david = new stdclass();
$david->name = "david";
$david->age = 12;
$david->id = 1;
$david->title = "manager";
$joe = new stdclass();
$joe->name = "joe";
$joe->age = 17;
$joe->id = 2;
$joe->title = "employee";
// option 1: lets put users by index
$users[] = $david;
$users[] = $joe;
// option 2: lets put users by title
$users[$david->title] = $david;
$users[$joe->title] = $joe;
지금 질문 : 관리자가 누구인가? 대답 :
$users["manager"]
그게 내가 말하려고했던거야! 당신은 나를 때려 눕힘 –
정말, 해시의 요점은 객체를 더 빠르게 찾는 것입니다. 그 해시 된 객체가 다른 객체와 연결되어 있다면, 그것은 대단합니다 (그리고 아마도 가장 일반적인 상황입니다). 하지만 C# (http://www.sgi.com/tech/stl/hash_set.html)에서 hash_set을 고려해보십시오. – Brian
저는 이것이 실제 세계의 실례라고 생각하지 않습니다. 사전을 통해 보는 사람은 보간 검색을 사용합니다. 실제 사전에는 단어를 찾는 O (1) 방법이 없습니다. –