You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正双数组DEAP的节点配对及初始化逻辑以满足规范?

双端优先队列(DEAP)配对关系修复方案

配对函数(MinPartner/MaxPartner)修正逻辑

DEAP的配对节点核心是同层对应位置优先,无对应节点则继承父节点配对,以下是具体实现:

MinPartner函数(最小堆节点找最大堆配对节点)

int MinPartner(int i, int nA, int nB) {
    if (i == 1) {
        return 1; // 最小堆根节点配对最大堆根节点
    }
    int p = i / 2; // 父节点索引
    int q = MinPartner(p, nA, nB); // 父节点的配对节点
    int j;
    if (i == 2 * p) {
        j = 2 * q; // 当前节点是左孩子,配对节点为父配对节点的左孩子
    } else {
        j = 2 * q + 1; // 当前节点是右孩子,配对节点为父配对节点的右孩子
    }
    // 如果计算出的配对节点超出最大堆元素范围,返回父节点的配对节点
    if (j > nB) {
        return q;
    }
    return j;
}

MaxPartner函数(最大堆节点找最小堆配对节点)

int MaxPartner(int j, int nA, int nB) {
    if (j == 1) {
        return 1; // 最大堆根节点配对最小堆根节点
    }
    int p = j / 2; // 父节点索引
    int q = MaxPartner(p, nA, nB); // 父节点的配对节点
    int i;
    if (j == 2 * p) {
        i = 2 * q; // 当前节点是左孩子,配对节点为父配对节点的左孩子
    } else {
        i = 2 * q + 1; // 当前节点是右孩子,配对节点为父配对节点的右孩子
    }
    // 如果计算出的配对节点超出最小堆元素范围,返回父节点的配对节点
    if (i > nA) {
        return q;
    }
    return i;
}

Initialize函数修正逻辑

Initialize函数需要完成两步:先分别构建最小堆A和最大堆B,再遍历所有节点验证并修复配对关系(确保最小堆节点值 ≤ 对应最大堆配对节点值)。

void Initialize(vector<int>& A, vector<int>& B, int& nA, int& nB) {
    // 1. 构建最小堆A
    for (int i = nA / 2; i >= 1; --i) {
        MinHeapify(A, i, nA);
    }
    // 2. 构建最大堆B
    for (int i = nB / 2; i >= 1; --i) {
        MaxHeapify(B, i, nB);
    }
    // 3. 验证并修复所有配对关系
    for (int i = 1; i <= nA; ++i) {
        int j = MinPartner(i, nA, nB);
        if (A[i] > B[j]) {
            // 交换节点值
            swap(A[i], B[j]);
            // 交换后重新调整对应堆的结构
            MinHeapify(A, i, nA);
            MaxHeapify(B, j, nB);
            // 递归检查父节点的配对关系(交换可能影响上层)
            int p = i / 2;
            while (p >= 1) {
                int q = MinPartner(p, nA, nB);
                if (A[p] > B[q]) {
                    swap(A[p], B[q]);
                    MinHeapify(A, p, nA);
                    MaxHeapify(B, q, nB);
                }
                p /= 2;
            }
        }
    }
}

辅助堆调整函数

需要实现标准的最小堆和最大堆调整逻辑:

void MinHeapify(vector<int>& A, int i, int nA) {
    int smallest = i;
    int left = 2 * i;
    int right = 2 * i + 1;
    if (left <= nA && A[left] < A[smallest]) {
        smallest = left;
    }
    if (right <= nA && A[right] < A[smallest]) {
        smallest = right;
    }
    if (smallest != i) {
        swap(A[i], A[smallest]);
        MinHeapify(A, smallest, nA);
    }
}

void MaxHeapify(vector<int>& B, int j, int nB) {
    int largest = j;
    int left = 2 * j;
    int right = 2 * j + 1;
    if (left <= nB && B[left] > B[largest]) {
        largest = left;
    }
    if (right <= nB && B[right] > B[largest]) {
        largest = right;
    }
    if (largest != j) {
        swap(B[j], B[largest]);
        MaxHeapify(B, largest, nB);
    }
}

测试验证说明

针对你提到的测试场景(5与45、10与25、8与40配对):

  • 调用MinPartner(对应5的A索引, nA, nB)应返回45在B中的索引
  • 调用MinPartner(对应10的A索引, nA, nB)应返回25在B中的索引
  • 调用MinPartner(对应8的A索引, nA, nB)应返回40在B中的索引
    配对关系确认后,Initialize函数会自动确保A[i] ≤ B[j],若初始值不满足则交换并调整堆结构。

内容的提问来源于stack exchange,提问作者benhpark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 09:57:08