从文件中给出一些字符串,ab,abc,ad,ace,ddd ...,以找出字符串中是否有字符串S.如果我想使用哈希来检查是否存在S.
算法分析:由于每个'put'操作需要O(1)* K时间,其中K是字符串的长度,因此构建映射需要O(n * K)时间,其中n是数字的字符串。查找需要恒定的时间,因此总时间为O(n * k)。这是正确的想法吗?虽然我们经常说散列表允许持续查找时间,但它通常会忽略构建散列所花费的时间。在回答这样的问题时,我应该说时间复杂度是O(n * k),还是O(n)?非常感谢。刚开始学习算法分析。
String line = null;
BufferedReader br = new BufferedReader(new File("file.txt"));
HashMap<String, Integer> strs = new HashMap<String,Integer>();
while((line=br.readLine()) != null){
Integer count = strs.get(line);
if( count == null){
strs.put(line, 1);
}
count++;
}
// Suppose the string to be checked is "str";
if(strs.contains(str)){
return true;
}
return false;
答案 0 :(得分:2)
当你说O(n)时,n与输入的大小成比例。但是,您要询问是否表示O(n * k),其中k也与输入的大小成比例。在这种情况下,你真正说的是O(n ^ 2) - 其中算法可能需要时间t来输入K,但输入2k需要时间4t。这是你的意思吗?
如果您只是想说该算法需要t时间用于k输入,而2t时间用于2k输入,那么您只需说算法为O(n)。
现在开始算法...如果我正确解释它,步骤是在读取文件时构建哈希,然后是哈希表查找。对文件的一次传递是O(n)并发将所有字符串放入哈希表中,该哈希表也是O(n)(假设哈希表得到了相当好的实现)。查找哈希表中的一个条目是O(1)。
总的来说,时间复杂度是O(n),与O(n)同时加上O(1)...通常我们只是将其描述为O(n),或者时间与线性比例的大小相等输入