【问题标题】:What is wrong with the implementation of this inversion count algorithm?这个反转计数算法的实现有什么问题?
【发布时间】:2015-12-30 11:29:00
【问题描述】:

我在 www.hackerrank.com 上做一个问题,我已经被困了好几天了。

这是问题https://www.hackerrank.com/challenges/insertion-sort的陈述。基本上,我必须计算在 O(nlog(n)) 时间内给定数组的插入排序中发生了多少交换。

http://paste.ubuntu.com/12637144/这是我提交的代码。我使用归并排序并计算每个元素移位的次数。该代码通过了该站点一半以上的测试。当它失败时它不会超时,并且它没有编译错误或分段错误。

此外,当我得到一个失败的测试用例的输入时(这是它在网站上失败的输入 http://paste.ubuntu.com/12637165/)并用我的代码http://paste.ubuntu.com/12637127/ 的这种变体对其进行了测试,它实际上运行了插入排序算法计算沿途的交换次数并将其与合并排序计数进行检查,我通过了所有测试。另外,我已经生成了数千个随机测试用例,并且它们也都通过了这个测试。

我不认为这对网站来说是个问题,因为在讨论这个问题时,其他人似乎都顺利通过了测试,没有任何问题或抱怨。所以也许我误解了这个问题,或者我只是为算法错误地编写了算法和测试用例。有人有什么建议吗?

【问题讨论】:

    标签: c algorithm sorting mergesort insertion-sort


    【解决方案1】:

    如果 n 可以达到 100000,那么没有。倒数可以是 ~= n^2 / 2,它不适合 32 位整数。尝试使用 64 位整数进行计数和合并排序的返回值。

    【讨论】:

    • 一开始我也是这么想的,然后测试了一下,但事实并非如此。 32 位有符号整数的最大值是 0x7fffffff,即 2,147,483,647。对于所有给定的数字范围,这已经绰绰有余了。
    • 试试这个输入法。 n = 100000 并且数组是 100000, 99999 ... 1。即使在 32 位无符号整数中,最终结果显然也不适合。您是否尝试将 count 变量的类型和 mergeSort 的返回类型更改为 long long 并进行测试?此外,最后的打印语句也很重要——你应该使用 %lld 而不是 %d。
    • 非常感谢!!我认为是 print 语句中对 lld 的更改使它起作用!
    猜你喜欢
    • 2021-11-02
    • 1970-01-01
    • 2010-11-10
    • 2013-08-27
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 2011-09-28
    相关资源
    最近更新 更多