椁愰ギ鎺掗槦绠$悊绯荤粺锛氶珮骞跺彂鍦烘櫙涓嬬殑闃熷垪浼樺寲鏂规

涓€銆佷笟鍔″満鏅垎鏋?/h2>

鍦ㄩ楗€佸尰鐤椼€侀摱琛岀瓑鏈嶅姟琛屼笟锛?strong>鏅鸿兘鎺掗槦绠$悊绯荤粺鏄彁鍗囨湇鍔℃晥鐜囧拰鐢ㄦ埛浣撻獙鐨勫叧閿€備竴涓畬鍠勭殑绛変綅绯荤粺闇€瑕佹敮鎸侊細

  • 椤惧鍔犲叆绛夊緟闃熷垪锛氳褰曚汉鏁板拰鍒拌揪鏃堕棿
  • 椤惧涓€旂寮€锛氭敮鎸佷换鎰忎綅缃殑蹇€熷垹闄?/li>
  • 鎸夋浣嶅閲忓尮閰?/strong>锛氭壘鍒扮涓€涓汉鏁颁笉瓒呰繃妗屼綅鐨勯【瀹㈢粍

闅剧偣鍦ㄤ簬锛氭棦瑕佷繚鎸?strong>鍏堟潵鍏堟湇鍔?FIFO)鐨勫叕骞虫€э紝鍙堣鏀寔O(1)鏃堕棿鐨勪换鎰忎綅缃垹闄?/strong>鍜?strong>鎸変汉鏁板揩閫熺瓫閫?/strong>銆?/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;
}
馃挕 鎳掑垹闄ょ瓥鐣ワ細涓嶅疄闄呯Щ鍔ㄦ暟缁勫厓绱狅紝鑰屾槸鏍囪涓洪潪娲昏穬銆傝繖鏍峰垹闄ゆ搷浣滀负O(1)锛屼唬浠锋槸鏌ヨ鏃堕渶瑕佽烦杩囧凡鍒犻櫎椤广€?

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) 骞冲潎

鍏朵腑 n 涓洪槦鍒楅暱搴︼紝k 涓虹鍚堟潯浠剁殑鍊欓€夋暟閲?/em>

鍥涖€佽繘闃朵紭鍖栨柟鍚?/h2>
  • 浣跨敤鍙屽悜閾捐〃锛氱湡姝e垹闄よ妭鐐硅€岄潪鎳掑垹闄わ紝鑺傜渷鍐呭瓨
  • TreeMap鍒嗘《锛氬綋浜烘暟鑼冨洿寰堝ぇ鏃讹紝鐢ㄥ钩琛℃爲绠$悊鍒嗘《
  • 浼樺厛绾ч槦鍒?/strong>锛氭敮鎸乂IP浼樺厛绛夊鏉傝皟搴︾瓥鐣?/li>
  • 鍒嗗竷寮忓満鏅?/strong>锛氬紩鍏edis瀹炵幇璺ㄦ湇鍔″櫒鐨勯槦鍒楀叡浜?/li>

浜斻€佸疄闄呭簲鐢ㄥ満鏅?/h2>

杩欏璁捐鏂规涓嶄粎閫傜敤浜庨鍘咃紝杩樺彲浠ユ墿灞曞埌锛?/p>

  1. 鍖婚櫌鎸傚彿绯荤粺锛氭寜绉戝鍜屽彿婧愬尮閰嶆偅鑰?/li>
  2. 閾惰鍙彿绯荤粺锛氭櫘閫?VIP鍒嗘祦
  3. 娓镐箰鍥帓闃?/strong>锛氭寜娓稿缁勫ぇ灏忓尮閰嶆父涔愯鏂?/li>
  4. 鍦ㄧ嚎瀹㈡湇鍒嗛厤锛氭寜闂绫诲瀷鍖归厤瀹㈡湇浜哄憳
闃熷垪绠楁硶 鍝堝笇琛?/span> 绯荤粺璁捐 鎳掑垹闄?/span> 鍒嗘《绛栫暐