我需要编写一个算法来检查字符串中字符的唯一性。我写了以下算法:
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)
?什么指标可以表明第一个算法比第二个算法好?
答案 0 :(得分:2)
尽管有外表,但你的算法是O(n),而不是O(n ^ 2)。
s
是一个字符串,字符数限制为16位。这意味着外部循环最多将执行65536次,并且只有当字符串长度正好为65536个字符并且每个代码点只包含一次时,才会出现这种最大情况。
通过这种观察,您可以创建O(1)解决方案。只需添加初始检查以查看字符串是否超过65536个字符,如果是,则立即返回true。如果不是,那么使用您的算法之一检查字符串是否重复。
答案 1 :(得分:1)
O
表示法用于分析算法的渐近行为,而不是精确的操作数(是的,这两种算法在这种表示法方面是相同的)。
如果要显示第一个算法更好,可以使用比较的字符对数(或循环迭代的总数)作为度量。
答案 2 :(得分:0)
您希望使用一种数据结构来告知该数据结构中是否已经给出了某个元素。
像hashtable一样。通过将单词的所有字符逐个添加到该表中,您可以轻松检查“要添加”字符是否已经存在。因此,您可以避免将每个字符与表中的其他字符进行比较的复杂性。