我正在准备考试,在运行时分析方面遇到了一些麻烦。我有以下两种方法,我对运行时分析感到困惑:
public boolean findDuplicates(String [] arr) {
Hashtable<String,String> h = new Hashtable<String,String>();
for (int i = 0; i < arr.length; i++) {
if (h.get(arr[i]) == null)
h.put(arr[i], arr[i]);
else
return true;
}
return false;
}
假设散列函数只在任何键上采用 O(1),运行时间是否会简单地为 O(n),因为在最坏的情况下,运行整个数组?如果每个散列函数需要恒定的时间来评估,我是否会沿着正确的思路考虑这一点?
我遇到的另一个问题似乎要复杂得多,我不知道如何解决这个问题。假设这些是arrarlists。
public boolean makeTranslation(List<Integer> lst1, List<Integer> lst2) {
//both lst1 and lst2 are same size and size is positive
int shift = lst1.get(0) - lst2.get(0);
for (int i = 1; i < lst1.size(); i++)
if ( (lst1.get(i) - lst2.get(i)) != shift)
return false;
return true;
}
在这种情况下,get 操作应该是恒定的,因为我们只是检索特定的索引值。但是在 for 循环中,我们既将其与 shift 进行比较,也对所有元素进行迭代。这将如何准确地转换为运行时间?
一个有用的解释将不胜感激,因为我比本课程中的任何内容都最难理解运行时分析,而我的期末考试是下周。