이 질문은 소프트웨어 회사에서 질문했습니다. 나는 간단한 해결책을 생각해 냈고 나는 다른 사람들이 그 해결책에 대해 어떻게 느끼는지 알고 싶다.인터뷰 : 시스템/API 디자인
님의 시스템에 대한 API와 백엔드를 설계 해야하는 그 도시에 살고있는 사람들에게 충당 전화 번호 수 있습니다. 전화 번호는 이고 111-111-1111부터 시작하여 999-999-9999로 끝납니다. API는 다음을 수행 클라이언트 (도시에있는 사람)를 활성화해야합니다
- 전화 번호에 대한 클라이언트 요청, 그것은 그들에게 가능한 번호 중 하나를 할당하게.
- 일부 클라이언트는 멋진 번호를 원할 수 있으므로 특별히 할당 된 번호를 요청할 수 있습니다. 요청한 번호가 인 경우 시스템에서 할당합니다. 그렇지 않으면 시스템에서 사용 가능한 번호를 할당합니다.
시스템은 어떤 번호가 클라이언트에 할당되는지 알 필요가 없습니다. 동일한 클라이언트가 연속 요청을하고 전화 번호를 여러 개 가져올 수 있지만 시스템에 문제가 발생하지는 않습니다. 어떤 시점에서, 시스템은 어떤 전화 번호가 으로 할당되어 있고 어떤 전화 번호가 무료인지만을 알고 있습니다.
111-111-1111부터 999-999-9999까지의 숫자는 대략 80 억 개의 숫자에 해당합니다. 메모리가 제약이 아니라고 가정하면 다음 두 가지 접근 방식을 생각할 수 있습니다 (거의 비슷합니다).
- 길이 80 억의 거대한 부울 배열을 유지하고 (
next
는 0으로 초기화된다) 배열 인덱스를 가리키는next
포인터를 가지고있다.next
이 가리키는 값이 비어 있지 않으면 무료 숫자가 발견 될 때까지next
을 전달하십시오. 공상적인 숫자가 요구 될 때, 해당 색인 위치가 자유로운지를 확인하고 그 숫자를 반환하십시오. 이 방법의 단점은 일반적인 방식으로 숫자를 할당 할 때 중간에 거대한 덩어리 (예를 들어 10 억 개)가 할당되어 공상적인 할당으로 할당 된 경우next
포인터를 10 억 번 이동해야한다는 것입니다. previos 디자인에서 언급 한 어려움을 극복하기 위해 일종의 연결된 해시 맵을 사용할 수 있습니다. 우리는 이중 연결리스트 (이전 디자인의 배열을 대체 함)와 배열의 각 요소가리스트의 해당 요소를 가리키는 목록과 동일한 길이의 또 다른 배열을 유지합니다. 그래서 일반적인 방법으로 숫자를 할당 할 때, 우리는 링크 된리스트의 포인터를 전진시키고 우리가 할당 할 때 노드를 표시합니다 (이전 방법과 동일). 화려한 번호를 할당 할 때 우리는 배열에서 먼저 색인을 생성하고 포인터를 따라 요구 한 특수 번호에 해당하는 노드를 목록에서 직접 찾을 수 있습니다. 노드가 식별되면 일반 노드와 다음 노드를 단락시켜 일반 할당을 수행 할 때 사용 된 번호를 하나씩 건너 뛸 필요가 없습니다 (이전 접근법의 문제점 이었음).
제가 올바른 길을 가고 있는지 알려주세요. 제가 빠뜨린 중요한 세부 사항을 알려주십시오.