屈婉玲版《算法设计与分析》JavaScript实现-锦标赛

396 阅读1分钟

屈老师关于锦标赛算法选择次优元素的讲解视频地址:www.bilibili.com/video/BV1Ls… ,屈老师的讲解逻辑缜密,通俗易懂,这里不再画蛇添足,主要着眼于代码的实现,也算是抛砖引玉。

代码:

/**
 *  模拟锦标赛选取次优的元素 
 * @param {number[]} arr 
 * @returns {number} second best number
 */
function tournament(arr) {
    // 使用Map来记录该Key所淘汰的元素
    let recorder = new Map();

    let max = _tour(arr);
    // 返回冠军所淘汰元素中最大的值
    return Math.max(...recorder.get(max));

    // 每一轮比赛淘汰一半的的元素
    function _tour(array) {
        // 用数组记录本轮比赛的胜者
        let winners = [],
            len = array.length;
        // 只剩一个元素时,比赛结束,该值即为冠军
        if (len == 1)
            return array[0];

        for (let i = 0; i < len - 1; i += 2) {
            let max = Math.max(array[i], array[i + 1]),
                min = Math.min(array[i], array[i + 1]);
            recorder.has(max) ? recorder.get(max).push(min) : recorder.set(max, [min]);
            winners.push(max);
        }
        // 元素数量为奇数时,轮空最后一个元素到下一场比赛
        len % 2 == 1 ? winners.push(array[len - 1]) : null;
        // 开始下一轮比赛
        return _tour(winners);
    }
}