所以我最近一直在研究与算法的运行时复杂性有关的所有问题,并且想要学习如何改变它们以提高n的规模时的效率,所以基本上我的目标是学习如何做东西O(log n)。想到我自己,我知道一个很好的小项目,我可以做这个小时,这就是创建一个字谜检查器。
我翻遍了几篇SO帖子,看到有人评论说如果你把字母表中的每个字母都分配给数字就可以记录下来:
final Map<Character, Integer> map;
String str = "hello";
String check = "olleh";
map = new HashMap<>();
map.put('a', 2);
map.put('b', 3);
map.put('c', 4);
map.put('d', 7);
map.put('e', 11);
map.put('f', 13);
map.put('g', 17);
map.put('h', 19);
map.put('i', 23);
map.put('j', 29);
map.put('k', 31);
map.put('l', 37);
map.put('m', 41);
map.put('n', 43);
map.put('o', 47);
map.put('p', 53);
map.put('q', 59);
map.put('r', 61);
map.put('s', 67);
map.put('t', 71);
map.put('u', 73);
map.put('v', 79);
map.put('w', 83);
map.put('x', 89);
map.put('y', 97);
map.put('z', 101);
然后我创建了方法:
public static boolean isAnagram(String s, String check,Map<Character, Integer> map) {
int stringTotal = 0;
int checkTotal = 0;
for(char ch: s.toCharArray()){
int i = map.get(ch);
stringTotal += ch;
}
for(char ch: check.toCharArray()){
int i = map.get(ch);
checkTotal +=ch;
}
if (stringTotal == checkTotal){
return true;
}
return false;
}
我认为这个方法是O(n ^ 2),因为它有两个独立的循环,我无法想到将其创建为O(log n)方法背后的逻辑。
任何指针都会很棒
答案 0 :(得分:0)
看起来是ObjectAnimator
:一个又一个O(2n)
的循环。如果您在n
的循环中嵌套循环O(n^2)
,您将获得n
,
像这样:
n
此处int count = 0;
for ( int x = 0; x < n; x++ )
for ( int y = 0; y < n; y++ )
count++;
为count
或n 2 。
在您粘贴的代码中,有两个循环:
n*n
此处int count = 0;
for ( int x = 0; x < n; x++ )
count++;
for ( int y = 0; y < n; y++ )
count++;
为count
或2n。
由于您始终需要检查所有n+n
值(所有字母),因此无法使用O(log n)
功能。
例如,我们假设我们计算的函数的确切time complexity为n
(请注意,这与 order {{ 1}}取消系数和低阶项)。
现在,如果log(n)
;然后O(log n)
(大约),如果你只看2.3个字母,你就不能确定十个字母的单词是另一个10个字母单词的字谜。