【问题标题】:C++ algorithm optimization: find K combination from N elementsC++算法优化:从N个元素中找到K个组合
【发布时间】:2014-11-17 06:42:34
【问题描述】:

我对 C++ 非常陌生,我正在尝试做一些 HackerRank 挑战,以此来解决这个问题。
现在我正在尝试解决愤怒的孩子问题:https://www.hackerrank.com/challenges/angry-children

基本上,它要求创建一个程序,给定一组 N 个整数,找到该集合的 K 长度子集的最小可能“不公平”。不公平定义为 K 长度子集的最大值和最小值之差。

我现在的方法是找到所有 K 长度的子集并计算它们的不公平性,跟踪最小的不公平性。

我编写了以下似乎正确解决问题的 C++ 程序:

#include <cmath>
#include <cstdio>
#include <iostream>

using namespace std;

int unfairness = -1;
int N, K, minc, maxc, ufair;
int *candies, *subset;

void check() {
    ufair = 0;
    minc = subset[0];
    maxc = subset[0];

    for (int i = 0; i < K; i++) {
        minc = min(minc,subset[i]);
        maxc = max(maxc, subset[i]);
    }

    ufair = maxc - minc;

    if (ufair < unfairness || unfairness == -1) {
        unfairness = ufair;
    }
}

void process(int subsetSize, int nextIndex) {
    if (subsetSize == K) {
        check();
    } else {
        for (int j = nextIndex; j < N; j++) {
            subset[subsetSize] = candies[j];
            process(subsetSize + 1, j + 1);
        }
    }
}

int main() {
    cin >> N >> K;
    candies = new int[N];
    subset = new int[K];

    for (int i = 0; i < N; i++)
        cin >> candies[i];

    process(0, 0);

    cout << unfairness << endl;

    return 0;
}

问题在于 HackerRank 要求程序在 3 秒内提出解决方案,而我的程序需要更长的时间才能找到 12/16 的测试用例的解决方案。例如,其中一个测试用例有 N = 50 和 K = 8;该程序需要 8 秒才能在我的机器上找到解决方案。我可以做些什么来优化我的算法?我对 C++ 不是很有经验。

【问题讨论】:

  • 你有没有想过对数组进行排序?比数字是间隔的,你只需要看一次 N 的数组。您也可以跳 K 步以使算法更快。假设你在 O(nlog n) 中排序并在 O(n) 中迭代,你将在 O(nlogn) 中完成这项工作,而不考虑所有 N^K 可能的组合。

标签: c++ algorithm optimization


【解决方案1】:

您所要做的就是按升序对所有数字进行排序,然后从0N - K(包括在内)的所有i 中得到最小的a[i + K - 1] - a[i]。 确实如此,因为在最优子集中,所有数字都在有序数组中连续定位。

【讨论】:

  • 更简单的思考问题的方法,谢谢!
【解决方案2】:

我给出的一个建议是在选择子集之前对整数列表进行排序。这将大大减少您需要检查的子集数量。实际上,您甚至不需要创建子集,只需查看索引 i(从 0 开始)和 i+k 处的元素,i 和 i+k [有效范围内] 处的所有元素的最低差是您的答案。因此,现在不是 n 选择 k 个子集(我相信阶乘运行时),您只需要查看 ~n 个子集(线性运行时),排序 (nlogn) 成为您的性能瓶颈。

【讨论】:

  • FunkyCat 击败了你几分钟,但我最终还是这样做了
猜你喜欢
  • 2013-01-15
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多