LinkedListSet 和 BSTSet的时间复杂度对比
- LinkedListSet的效率明显比BSTSet的慢;
- 原因是:LinkedListSet在add的时候需要先判断一下链表中是否存在待添加元素,而contains的时间复杂度是O(n),所以LinkedListSet的add的时间复杂度是O(n);而BSTSet的add的时间复杂度是O(logn)的,所以LinkedListSet的效率比BSTSet的明显慢;
public class Main {
private static double testSet(Set<String> set, String filename){
long startTime = System.nanoTime();
System.out.println(filename);
ArrayList<String> words = new ArrayList<>();
if(FileOperation.readFile(filename, words)) {
System.out.println("Total words: " + words.size());
for (String word : words)
set.add(word);
System.out.println("Total different words: " + set.getSize());
}
long endTime = System.nanoTime();
return (endTime - startTime) / 1000000000.0;
}
public static void main(String[] args) {
String filename = "pride-and-prejudice.txt";
BSTSet<String> bstSet = new BSTSet<>();
double time1 = testSet(bstSet, filename);
System.out.println("BST Set: " + time1 + " s");
System.out.println();
LinkedListSet<String> linkedListSet = new LinkedListSet<>();
double time2 = testSet(linkedListSet, filename);
System.out.println("Linked List Set: " + time2 + " s");
}
}
输出:
a-tale-of-two-cities.txt
Total words: 141489
Total different words: 9944
BST Set: 0.193731401 s
a-tale-of-two-cities.txt
Total words: 141489
Total different words: 9944
Linked List Set: 5.102809299 s
BSTSet的时间复杂度
- add:O(h) = O(log2(n+1)) = O(logn)
- contains:O(h) = O(log2(n+1)) = O(logn)
- remove:O(h) = O(log2(n+1)) = O(logn)
- 注意:h = log2(n+1)是以满二叉树的情况下计算出的,二叉树在极端的情况下可以退化成链表,此时h = n,当以1,2,3,4,5,6这样的顺序向BST中添加元素的时候就可以让BST退化成链表,解决这个问题的方案就是创建平衡二叉树;
LinkedListSet的时间复杂度
- add:O(n)
- contains:O(n)
- remove:O(n)
特别注意
- 基于链表实现的集合是无需集合;
- 基于BST实现的集合是有序集合;