涓€銆侀棶棰樻弿杩?/h2>
鍦ㄨ澶氬疄闄呭簲鐢ㄤ腑锛屾垜浠渶瑕佹牴鎹笉鍚岀殑鏉冮噸鏉ラ殢鏈洪€夋嫨鍏冪礌銆傚吀鍨嬪満鏅寘鎷細
- 骞垮憡鎶曟斁锛氭寜鍑轰环鏉冮噸閫夋嫨灞曠ず鐨勫箍鍛?/li>
- 璐熻浇鍧囪 锛氭寜鏈嶅姟鍣ㄥ閲忓垎閰嶈姹?/li>
- 鎶藉绯荤粺锛氫笉鍚屽鍝佹湁涓嶅悓涓姒傜巼
- 鍩庡競浜哄彛閲囨牱锛氭寜浜哄彛姣斾緥闅忔満閫夋嫨鍩庡競
缁欏畾鍩庡競鍙婂叾浜哄彛鏁版嵁锛氬寳浜?2100涓?銆佷笂娴?2400涓?銆佸箍宸?1500涓?銆傛瘡娆¤皟鐢ㄨ繑鍥炰竴涓煄甯傚悕锛岃繑鍥炴鐜囧簲姝f瘮浜庡叾浜哄彛鍗犳瘮銆?/p>
鏈熸湜姒傜巼锛氬寳浜?35%銆佷笂娴?40%銆佸箍宸?25%
浜屻€佸墠缂€鍜?+ 浜屽垎鏌ユ壘鏂规
2.1 鏍稿績鎬濊矾
灏嗘潈閲嶈浆鎹负杩炵画鐨勫尯闂?/strong>锛岀劧鍚庣敓鎴愰殢鏈烘暟鍒ゆ柇钀藉叆鍝釜鍖洪棿锛?/p>
缁欏畾涓€妫典簩鍙夋悳绱㈡爲鍜屼竴涓洰鏍囧€硷紝鎵惧埌鏍戜腑涓庣洰鏍囧€兼渶鎺ヨ繎鐨勮妭鐐瑰€笺€?/p>
BST鐨勭壒鎬у喅瀹氫簡锛?/p>
鍥犳锛屼粠鏍硅妭鐐瑰嚭鍙戯紝姣忔鏍规嵁鐩爣鍊间笌褰撳墠鑺傜偣鐨勫ぇ灏忓叧绯伙紝閫夋嫨寰€宸︽垨寰€鍙宠蛋锛?strong>璺緞涓婁竴瀹氫細缁忚繃娼滃湪鐨勬渶浼樿В
2.2 瀹屾暣瀹炵幇
class WeightedRandomSelector<T> {
private items: T[];
private prefixSum: number[];
private totalWeight: number;
constructor(itemsWithWeights: Array<{item: T, weight: number}>) {
this.items = [];
this.prefixSum = [];
let cumulative = 0;
for (const {item, weight} of itemsWithWeights) {
this.items.push(item);
cumulative += weight;
this.prefixSum.push(cumulative);
}
this.totalWeight = cumulative;
}
select(): T {
// 鐢熸垚 [0, totalWeight) 鑼冨洿鐨勯殢鏈烘暟
const randomValue = Math.random() * this.totalWeight;
// 浜屽垎鏌ユ壘绗竴涓ぇ浜?randomValue 鐨勫墠缂€鍜屼綅缃?
let left = 0;
let right = this.prefixSum.length - 1;
while (left < right) {
const mid = Math.floor((left + right) / 2);
if (this.prefixSum[mid] <= randomValue) {
left = mid + 1;
} else {
right = mid;
}
}
return this.items[left];
}
}
// 浣跨敤绀轰緥
const citySelector = new WeightedRandomSelector([
{ item: "鍖椾含", weight: 2100 },
{ item: "涓婃捣", weight: 2400 },
{ item: "骞垮窞", weight: 1500 }
]);
// 澶氭璋冪敤锛屾鐜囧垎甯冪鍚堜汉鍙f瘮渚?
console.log(citySelector.select()); // 闅忔満杩斿洖鍩庡競鍚?
涓夈€佹墿灞曢鐩細BST涓煡鎵炬渶鎺ヨ繎鐩爣鐨勫€?/h2>
3.1 闂鎻忚堪
3.2 鍒╃敤BST鐗规€х殑瑙f硶
interface TreeNode {
val: number;
left: TreeNode | null;
right: TreeNode | null;
}
function findClosestValue(root: TreeNode | null, target: number): number {
let closest = root?.val ?? 0;
let minDiff = Math.abs(closest - target);
let current = root;
while (current !== null) {
const currentDiff = Math.abs(current.val - target);
// 鏇存柊鏈€鎺ヨ繎鍊?
if (currentDiff < minDiff) {
minDiff = currentDiff;
closest = current.val;
}
// 瀹屽叏鍖归厤锛岀洿鎺ヨ繑鍥?
if (currentDiff === 0) {
return closest;
}
// 鍒╃敤BST鎬ц川閫夋嫨鎼滅储鏂瑰悜
if (target < current.val) {
current = current.left; // 鐩爣鏇村皬锛屽線宸﹀瓙鏍戞壘
} else {
current = current.right; // 鐩爣鏇村ぇ锛屽線鍙冲瓙鏍戞壘
}
}
return closest;
}
3.3 绠楁硶鍘熺悊
鍥涖€佺畻娉曞姣旀€荤粨
| 绠楁硶 | 搴旂敤鍦烘櫙 | 鏃堕棿澶嶆潅搴?/th> |
|---|---|---|
| 鍔犳潈闅忔満閲囨牱 | 鎸夋鐜囬殢鏈洪€夋嫨 | O(log n) |
| BST鏈€杩戝€兼煡鎵?/td> | 鏌ユ壘鏈€鐩镐技鍏冪礌 | O(h) |
鍏朵腑 h 涓烘爲鐨勯珮搴︼紝骞宠 BST鏃?h = O(log n)