小编Set*_*eno的帖子

用于处理列表的所有连续子序列的朴素代码的算法复杂度:n ^ 2或n ^ 3?

我正在研究测试并发现了这个问题:

我无法确定复杂性,我认为它是O(n 2)或O(n 3)而我倾向于O(n 3).
有人能告诉我它是什么以及为什么?

我认为它是O(n 2)是因为在j循环中,j = i它给出了一个三角形的形状,然后k循环从i + 1j,我认为是三角形的另一半.

public static int what(int[] arr)
{
    int m = arr[0];
    for (int i=0; i<arr.length; i++)
    {
        for (int j=i; j<arr.length;j++)
        {
            int s = arr[i];
            for (int k=i+1; k<=j; k++)
             s += arr[k];
            if (s > m)
             m = s;
        }
    }
    return m;
}
Run Code Online (Sandbox Code Playgroud)

如果你能告诉我它的作用吗?

我想它返回正整数的加法或数组中的最大整数.
但对于像{99, -3, 0, 1}它这样的数组返回99 …

java algorithm big-o time-complexity

29
推荐指数
3
解决办法
2286
查看次数

有效地查找已排序数组中的整数量

我正在学习考试,并发现了这个问题.

您将获得一个排序的整数数组,例如:

{-5, -5, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 67, 67, 99}
Run Code Online (Sandbox Code Playgroud)

写一个方法:

Public static int count (int[] a, int x)
Run Code Online (Sandbox Code Playgroud)

返回数字'x'在数组中的次数.

例如:

x = -5, it returns 2
x = 2, it returns 5
x = 8, it returns 0
Run Code Online (Sandbox Code Playgroud)

我需要尽可能高效地写它,请不要给我答案(或者如果你愿意的话写下来,但我不会看),我的想法是做二分搜索,然后去两边(向后)我找到的值和索引号,返回正确的答案,我的问题是:

  1. 这是最有效的方式吗?
  2. 在最坏的情况下,它不会是O(n)吗?(当数组填充一个数字时) -

如果是这样 - 那我为什么要进行二分搜索呢?

java algorithm binary-search time-complexity

10
推荐指数
3
解决办法
615
查看次数

三元搜索比二分搜索更糟糕?

人们通常会问这个问题的反面(三元搜索是否优于二元搜索?).

我真的认为情况更糟(不是在O(log n)的复杂性方面).我真的不善于数学,只是纯粹的直觉.

如果我们采用大小为n的数组并使用二进制搜索,在第一次比较之后我们有n/2问题大小,并且在第二次比较之后我们有n/4的问题大小.

通过三元搜索,第一个循环运行已经进行了2次比较!我们的问题大小为n/3.

我是对的还是我错过了什么?在我阅读的所有内容中,人们通常会考虑到三元搜索的第一个循环运行是1比较,我认为这是错误的.

algorithm complexity-theory time-complexity

3
推荐指数
1
解决办法
2315
查看次数