javascript - 无法使用复杂性度量定义更好的算法

标签 javascript algorithm

我需要编写一个算法来检查字符串中字符的唯一性。我编写了以下算法:

function unique(s) {
    for (var i=0; i<s.length-1; i++) {
        for (j=i+1; j<s.length; j++) {
            if (s[i] === s[j]) {
                return false;
            }
        }
    }
    return true;
}

计算最坏情况下的操作数时,公式为

n/2x(n-1)=(n^2-n)/2

复杂度O(n)=n^2

现在,我可能编写了以下未优化的算法:

function unique(s) {
    for (var i=0; i<s.length; i++) {
        for (j=0; j<s.length; j++) {
            if ((s[i] === s[j]) && (i!==j)) {
                return false;
            }
        }
    }
    return true;
}

但它给出了相同的0(n)=n^2。所以看来我无法根据 0(n) 判断哪种算法更好 - 这是正确的吗?那么为什么要使用0(n)呢?什么指标可以表明第一个算法比第二个算法更好?

最佳答案

不管表面上如何,你的算法都是 O(n),而不是 O(n^2)。

s 是一个字符串,字符限制为 16 位。这意味着外层循环最多执行 65536 次,并且只有当字符串的长度正好是 65536 个字符并且每个代码点恰好包含一次时,才会出现这种最大情况。

通过此观察,您可以创建 O(1) 解决方案。只需添加一个初始检查来查看字符串是否长于 65536 个字符,如果是则立即返回 true。如果不是,则使用任一算法来检查字符串是否有重复项。

关于javascript - 无法使用复杂性度量定义更好的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40206207/

相关文章:

Python 算法挑战?

javascript - 动态改变 DOM 中的图像

javascript - 在 HTML 和 Javascript 中创建和更新图表

javascript - 确定用户输入字段是否为空

javascript - 如何在 Flot 饼图中显示小值

algorithm - 将位置绘制成不规则矩形

string - 没有相邻重复序列的最长 3 个字符的字符串?

javascript - 了解编辑距离

javascript - 如何使用 CSS 渐变在模拟时钟上突出显示 25 分钟?

algorithm - O(N) 中直到 N 为止的数字除数的计数?