【问题标题】:Need a faster algorithm to count if a product is smaller than a given number如果产品小于给定数量,需要更快的算法来计算
【发布时间】:2017-05-03 09:35:55
【问题描述】:

我有下一个问题: 我的程序读取两个数组并将第一个数组的每个元素与第二个数组的每个元素相乘。我必须计算小于给定数字的结果数量。我的代码工作正常,但我需要找到更快的算法。

这是我的代码:

void sort(int *array, int length)
{
    int index, jndex = 0, aux, compElPoz;
    for(index = 1; index < length; index++)
    {
        jndex = index - 1;
        compElPoz = index;
        while(array[compElPoz] < array[jndex])
        {
            aux = array[compElPoz];
            array[compElPoz] = array[jndex];
            array[jndex] = aux;
            if(jndex > 0)
                jndex--;
            compElPoz--;
        }
    }
}
int main()
{
    unsigned int n, in, jn, nr = 0, p, m;
    scanf("%u %u", &n, &p);
    int ar[n];//1st array
    for(in = 0; in < n; in++)
    {
        scanf("%u", &ar[in]);//reading the 1st array
    }
    scanf("%u", &m);
    int arr[m];//2nd array
    for(in = 0; in < m; in++)
    {
        scanf("%u", &arr[in]);//reading the 2nd array
    }
    sort(arr, m);//sorting the 2nd array
    for(in = 0; in < n; in++)
    {
        for(jn = 0; jn < m; jn++)
        {
            if(ar[in] * arr[jn] < p)
                nr++;
            else
                break;
        }
    }
    printf("%d", nr);
    return 0;
}

所以我必须阅读 ar[] 和 arr[] 和 p。 这是一个例子:

n = 5
p = 99
ar[5] = {1, 2, 3, 4, 5}
m = 2
arr[2] = {34, 25}

程序将打印 5,因为 1 * 34

【问题讨论】:

  • 这个问题属于这里:codereview.stackexchange.com
  • 对 ar[] 数组也进行排序。
  • 做到了,但还是不够快
  • @MichaelWalz 我必须删除它并在 codereview 上询问它还是可以移动它吗?
  • @Timotei:仅排序是不够的,您必须利用数组已排序的事实。您可以跳过大部分内部循环,方法是从您之前停止的位置开始,然后在已排序的第二个数组中查找下一个项目,其中第一个项目的当前项目的产品低于您的阈值。您将只遍历每个数组一次,但将向后遍历第二个数组。

标签: c arrays algorithm


【解决方案1】:

我假设元素是积极的。

  1. 使用快速排序方法(例如库 qsort())对两个数组进行排序。时间复杂度为O(nlogn+mlogm)
  2. 假设您用乘法结果填充二维表。请注意,每一行每一列都已排序。
  3. 使用二分搜索(或数字本身,如果存在)在 given number 的假想矩阵的周边找到一个位置。 O(log(n)+log(m))
  4. 遍历矩阵直到另一个边,以将较大的值与较小的值分开并计算它们。 O(n+m)

请注意,您不应该计算所有矩阵条目(以避免二次复杂度),只需要计算!

这是herehere描述的一种算法(看优秀图)

【讨论】:

  • 您可以跳过第 3 步并保持相同的复杂性。只需从右上角开始走,向左走直到产品变小,然后向下走一个并重复,同时总结到左边缘的距离。
  • @maraca 是的,这是我写的第一个变种,然后我决定展示一个简单的开始方式。
  • @MBo 我认为我的代码更快,因为当找到大于我的“p”的值时它会停止。我的意思是它只计算“asnwer + 1”产品。
  • 不,你错了。首先,您使用的是二次排序方法。其次 - 您的算法最多检查 M*N 个结果,而计数问题不需要全部查找或输出 - 只需找到一个数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 2018-09-13
  • 1970-01-01
  • 2021-12-18
  • 2014-09-13
相关资源
最近更新 更多