[CareerCup] 10.2 Data Structures for Large Social Network 대형 소 셜 네트워크 의 데이터 구조
10.2 How would you design the data structures for a very large social network like Facebook or Linkedln? Describe how you would design an algorithm to show the connection, or path, between two people (e.g., Me -> Bob -> Susan -> Jason -> You).
이 문 제 는 우리 로 하여 금 대형 소 셜 네트워크 서비스의 데이터 구 조 를 실현 하 게 한다. 먼저 사용자 류 Person 은 친구 와 다른 정 보 를 포함 해 야 한다. 그리고 대형 사 이 트 는 보통 수백 만 명의 사용자 가 있 을 수 있다. 우 리 는 모든 데 이 터 를 기계 에 존재 할 수 없 기 때문에 우 리 는 친 구 를 찾 을 때 친구 가 있 는 기 계 를 먼저 찾 은 다음 에 기계 에서 친 구 를 조회 해 야 한다.모든 친구 나 기 계 는 자신의 번 호 를 가지 고 있 습 니 다. 빠 른 검색 을 위해 해시 표를 사용 하여 맵 을 만 들 었 습 니 다. 코드 는 다음 과 같 습 니 다.
class Person {
public:
Person(int id): _personID(id) {}
int getID() { return _personID; }
void addFriend(int id) { _friendIDs.push_back(id); }
private:
vector<int> _friendIDs;
int _personID;
};
class Machine {
public:
unordered_map<int, Person*> _persons;
int _machineID;
Person* getPersonWithID(int personID) {
if (_persons.find(personID) == _persons.end()) {
return nullptr;
}
return _persons[personID];
}
};
class Server {
public:
unordered_map<int, Machine*> _machines;
unordered_map<int, int> _personToMachineMap;
Machine* getMatchineWithId(int machineID) {
if (_machines.find(machineID) == _machines.end()) {
return nullptr;
}
return _machines[machineID];
}
int getMachineIDForUser(int personID) {
if (_personToMachineMap.find(personID) == _personToMachineMap.end()) {
return -1;
}
return _personToMachineMap[personID];
}
Person* getPersonWithID(int personID) {
if (_personToMachineMap.find(personID) == _personToMachineMap.end()) {
return nullptr;
}
int machineID = _personToMachineMap[personID];
Machine *machine = getMatchineWithId(machineID);
if (machine == nullptr) return nullptr;
return machine->getPersonWithID(personID);
}
};
최적화: 기계 점프 감소
기계 간 의 점프 비용 이 많이 든다. 우 리 는 보통 기계 간 에 무 작위 점프 를 하지 않 는 다. 보통 내 가 많은 친구 들 이 같은 기계 에 있 으 면 그들 을 함께 방문 할 것 이다.
최적화: 스마트 한 분류 자 와 기계
사람들 은 그들 과 같은 나라 에서 온 사람 을 추가 할 가능성 이 높 기 때문에 같은 도시, 주, 국가의 사람들 은 모두 가능 한 한 같은 기계 에 저장 해 두 어야 한다. 이렇게 찾 을 때 기계 의 도약 을 줄 일 수 있다.
질문: BFS 검색 은 읽 은 것 으로 점 을 표시 해 야 합 니 다. 여 기 는 어떻게 처리 합 니까?
여러 검색 이 동시에 진 행 될 수 있 기 때문에 데 이 터 를 직접 표시 하 지 는 않 지만, 데이터 가 방 문 했 는 지 여 부 를 표시 하기 위해 해시 표를 사용 합 니 다.
또 다른 문 제 는 고려 할 수 있다.
1. 현실 에서 서버 가 무 너 지면 어떻게 하나 요?
2. 캐 시 기능 을 어떻게 잘 활용 합 니까?
3. 그림 의 끝 을 찾 을 수 있 습 니까? 언제 검색 을 중단 할 지 어떻게 결정 합 니까?
4. 실제 적 으로 모든 사람의 친구 수가 다 릅 니 다. 어떤 사람 은 당신 과 다른 사람 사이 에 친구 체인 을 만 들 고 싶 어 합 니 다. 이 데 이 터 를 어떻게 사용 하여 어디서 옮 겨 다 니 는 지 확인 해 야 합 니까?
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.