这种排序算法正确吗?

时间:2019-05-09 13:48:08

标签: algorithm sorting

我正在尝试CLRS中的问题2.3-7,其中指出:

描述一个theta(n log(n))时间算法,该算法在给定一组S个n个整数和另一个整数x的情况下,确定S中是否存在两个元素的总和恰好是x。

我的算法如下:

Class::new

这似乎是在theta(n lg(n))时间内运行的,因为我们可以做到

  1. 在theta(n(lg(n))时间,使用“合并排序”
  2. 在O(n)时间里
  3. 在theta(nlg(n))时间二进制搜索S'中的n个元素中的每个元素
  4. 在O(n)时间里
  5. 在O(n)时间里

总和为theta(n log(n))。这是正确的吗?

1 个答案:

答案 0 :(得分:0)

这可以使用HashMap在线性时间内完成,且空间复杂度为O(n)。

    private Boolean testElementSum(List<Integer> list, int sumNumber) {
        HashMap<Integer, Boolean> map = new HashMap<>();
        for (int x : list) {
            if (map.containsKey(x))
                return (map.get(x));

            map.put(sumNumber - x, true);
        }
        return false;
    }

    @Test
    private void testSum() {
        List<Integer> list = Arrays.asList(1, 2, 3, 9, 20, 33);
        Assert.assertTrue(testFummy(list, 29));
        Assert.assertTrue(testFummy(list, 3));
        Assert.assertTrue(testFummy(list, 53));
        Assert.assertTrue(testFummy(list, 12));
        Assert.assertFalse(testFummy(list, 100));
        Assert.assertFalse(testFummy(list, 0));
    }