涓€銆佷笟鍔″満鏅垎鏋?/h2>
鍦ㄩ楗€佸尰鐤椼€侀摱琛岀瓑鏈嶅姟琛屼笟锛?strong>鏅鸿兘鎺掗槦绠$悊绯荤粺鏄彁鍗囨湇鍔℃晥鐜囧拰鐢ㄦ埛浣撻獙鐨勫叧閿€備竴涓畬鍠勭殑绛変綅绯荤粺闇€瑕佹敮鎸侊細
- 椤惧鍔犲叆绛夊緟闃熷垪锛氳褰曚汉鏁板拰鍒拌揪鏃堕棿
- 椤惧涓€旂寮€锛氭敮鎸佷换鎰忎綅缃殑蹇€熷垹闄?/li>
- 鎸夋浣嶅閲忓尮閰?/strong>锛氭壘鍒扮涓€涓汉鏁颁笉瓒呰繃妗屼綅鐨勯【瀹㈢粍
闅剧偣鍦ㄤ簬锛氭棦瑕佷繚鎸?strong>鍏堟潵鍏堟湇鍔?FIFO)鐨勫叕骞虫€э紝鍙堣鏀寔O(1)鏃堕棿鐨勪换鎰忎綅缃垹闄?/strong>鍜?strong>鎸変汉鏁板揩閫熺瓫閫?/strong>銆?/p>
鎴戜滑閲囩敤涓夌鏁版嵁缁撴瀯鐨勭粍鍚堟柟妗堬細 鍏朵腑 n 涓洪槦鍒楅暱搴︼紝k 涓虹鍚堟潯浠剁殑鍊欓€夋暟閲?/em> 杩欏璁捐鏂规涓嶄粎閫傜敤浜庨鍘咃紝杩樺彲浠ユ墿灞曞埌锛?/p>
浜屻€佸鏁版嵁缁撴瀯缁勫悎璁捐
2.1 鏍稿績鏁版嵁缁撴瀯閫夋嫨
interface WaitingParty {
partyId: string; // 鍞竴鏍囪瘑
partySize: number; // 浜烘暟
arrivalTime: number; // 鍒拌揪鏃堕棿鎴?
isActive: boolean; // 鏄惁浠嶅湪绛夊緟
}
class WaitlistManager {
// 1. 鏈夊簭闃熷垪锛氱淮鎶ゅ埌杈鹃『搴?
private queue: WaitingParty[] = [];
// 2. 蹇€熷畾浣嶈〃锛歱artyId -> 闃熷垪绱㈠紩
private indexMap: Map<string, number> = new Map();
// 3. 浜烘暟鍒嗘《锛歴ize -> 璇ヤ汉鏁扮殑绛夊緟缁勫垪琛?
private sizeBuckets: Map<number, Set<string>> = new Map();
// 4. 鏈€澶т汉鏁颁笂闄愶紙鐢ㄤ簬閬嶅巻浼樺寲锛?
private readonly MAX_PARTY_SIZE = 20;
}2.2 鍔犲叆闃熷垪鎿嶄綔
joinWaitlist(partyId: string, partySize: number): void {
const party: WaitingParty = {
partyId,
partySize,
arrivalTime: Date.now(),
isActive: true
};
// 鍔犲叆闃熷垪灏鹃儴
const index = this.queue.length;
this.queue.push(party);
// 鏇存柊绱㈠紩鏄犲皠
this.indexMap.set(partyId, index);
// 鍔犲叆浜烘暟鍒嗘《
if (!this.sizeBuckets.has(partySize)) {
this.sizeBuckets.set(partySize, new Set());
}
this.sizeBuckets.get(partySize)!.add(partyId);
}2.3 绂诲紑闃熷垪鎿嶄綔锛堟噿鍒犻櫎锛?/h3>
leaveWaitlist(partyId: string): boolean {
const index = this.indexMap.get(partyId);
if (index === undefined) return false;
const party = this.queue[index];
if (!party.isActive) return false;
// 鏍囪涓洪潪娲昏穬锛堟噿鍒犻櫎锛?
party.isActive = false;
// 浠庡垎妗朵腑绉婚櫎
this.sizeBuckets.get(party.partySize)?.delete(partyId);
// 浠庣储寮曡〃绉婚櫎
this.indexMap.delete(partyId);
return true;
}2.4 鎸夊閲忓尮閰嶏紙鏍稿績绠楁硶锛?/h3>
findFirstFitParty(tableCapacity: number): WaitingParty | null {
// 鏂规涓€锛氶亶鍘嗛槦鍒楋紝鎵剧涓€涓鍚堟潯浠剁殑娲昏穬缁?
for (const party of this.queue) {
if (party.isActive && party.partySize <= tableCapacity) {
return party;
}
}
return null;
}
// 浼樺寲鏂规锛氬埄鐢ㄥ垎妗跺揩閫熺瓫閫?
findFirstFitPartyOptimized(tableCapacity: number): WaitingParty | null {
// 鏀堕泦鎵€鏈夌鍚堜汉鏁版潯浠剁殑partyId
const candidates: string[] = [];
for (let size = 1; size <= tableCapacity && size <= this.MAX_PARTY_SIZE; size++) {
const bucket = this.sizeBuckets.get(size);
if (bucket) {
candidates.push(...bucket);
}
}
if (candidates.length === 0) return null;
// 鎸夊埌杈炬椂闂存帓搴忥紝杩斿洖鏈€鏃╃殑
let earliest: WaitingParty | null = null;
let earliestTime = Infinity;
for (const partyId of candidates) {
const index = this.indexMap.get(partyId);
if (index !== undefined) {
const party = this.queue[index];
if (party.isActive && party.arrivalTime < earliestTime) {
earliest = party;
earliestTime = party.arrivalTime;
}
}
}
return earliest;
}涓夈€佸鏉傚害瀵规瘮鍒嗘瀽
鎿嶄綔
鍩虹鏂规
浼樺寲鏂规
鍔犲叆闃熷垪
O(1)
O(1)
绂诲紑闃熷垪
O(1)
O(1)
鎸夊閲忓尮閰?/td>
O(n)
O(k) 骞冲潎
鍥涖€佽繘闃朵紭鍖栨柟鍚?/h2>
浜斻€佸疄闄呭簲鐢ㄥ満鏅?/h2>