【发布时间】:2012-11-25 16:39:15
【问题描述】:
我正在使用 Java 开发一个简单的搜索引擎。
搜索引擎首先将包含要搜索的文件(txt 文件)的目录名称作为输入,并且在每个文件中包含许多单词。
然后搜索引擎为搜索中遇到的所有单词创建一个倒排索引 目录。引擎读取每个文件并将每个单词插入到 doubleLinkedList 中。
问题是,当我处理包含 100 个 .txt 文件的目录时:
索引时间:~201ms 排序时间:2463ms
排序一个目录包含1000个文件
索引时间:2461ms 排序时间:922654ms
排序一个目录包含10000个文件
大约 10 小时 :(
有没有什么办法可以减少执行时间?
我使用了插入排序,对排序算法有什么建议吗?
DoubleLinkedList 类的实现
public class DoubleLinkedList<T> {
private Node<T> head;
private Node<T> current;
public DoubleLinkedList(){
head = current = null;
}
public boolean empty(){
return head == null;
}
public boolean last(){
return current.next==null;
}
public boolean first(){
return current.previous == null;
}
public boolean full(){
return false;
}
public void findFirst(){
current = head;
}
public void findNext(){
current = current.next;
}
public void findPrevious(){
current = current.previous;
}
public T retrieve(){
return current.data;
}
public void update(T val){
current.data = val;
}
public void insert(T val){
if(head == null){
head = current = new Node<T>(val);
}else{
Node<T> tmp = new Node<T>(val);
tmp.next = current.next;
tmp.previous = current;
if(current.next != null)
current.next.previous = tmp;
current.next = tmp;
current = tmp;
}
}
public void remove(){
if(current == head){
head = head.next;
if(head!=null){
head.previous=null;
}
}else{
current.previous.next = current.next;
if(current.next!=null){
current.next.previous = current.previous;
}
}
if(current.next == null){
current = head;
}else{
current = current.next;
}
}
}
【问题讨论】:
-
我可以建议对于搜索引擎,依赖任何排序方式都不会很好地扩展吗?
-
@Mohammad:你是什么意思,你用了 insertSort?你没用吗:
Collections.sort(doubleLinkedList)?这是归并排序 -
@Cratylus 不,我使用了不同的 DoubleLinkedList。我没有使用任何形式的“收藏”。
-
@Mohammad:这不是标准集合吗?你想出了自己的数据结构?所以基本上你想出了你自己的双链接列表实现,你自己的插入排序实现和 1)你抱怨你有性能问题 2)你没有发布你的代码?
标签: java performance sorting linked-list search-engine