我有一个非常大的矢量,可存储100000个不同的值,范围从0到50000。 它们代表硬盘上的柱面,我想根据用于磁盘调度的三种不同算法对该向量进行排序。 到目前为止,我从一个文件中读取了这100000个值,将它们存储到一个向量中,然后根据所需的算法(FCFS,SCAN,SSTF)对它们进行排序。问题是,它需要太长时间,因为我在最不具创意的方式:
public static Vector<Integer> sortSSTF(Vector<Integer> array){
Vector<Integer> positions = new Vector<Integer>(array);
Vector<Integer> return_array = new Vector<Integer>();
int current_pos = 0,minimum,final_pos;
while(positions.size() > 0){
minimum = 999999;
final_pos = current_pos;
for(int i=0 ; i < positions.size() ; i++){
//do some math
}
}
return_array.add(final_pos);
current_pos = final_pos;
positions.removeElement(final_pos);
}
return return_array;
}
我的函数将一个向量作为参数,复制它,进行一些数学运算以从复制的数组中找到所需的元素并将其存储在另一个数组中,该数组应根据所选算法进行排序。但是一个有N个元素的数组,它取N!迭代完成,这太过分了,因为代码应该至少执行10次。
我的问题是,如何让这种排序更有效率?
答案 0 :(得分:2)
Java已经有内置方法可以非常快速地对List
进行排序;见Collections.sort
。
Vector
已过时,由于其同步开销而导致性能下降。请改为使用List
实施(例如,ArrayList
)。
也就是说,根据你问题的内容,听起来你很难实现Shortest Seek Time First算法。
请参阅相关问题Shortest seek time first algorithm using Comparator。
如果您还没有提供头部的当前位置作为排序方法的参数,我认为您不能实现SSTF或SCAN算法。假设current_postion的初始值始终为0,则只会给出一个按升序排序的列表,在这种情况下,您的方法将如下所示:
public static List<Integer> sortSSTF(List<Integer> cylinders) {
List<Integer> result = new ArrayList<Integer>(cylinders);
Collections.sort(result);
return result;
}
但是,如果首次进入方法时current_pos > 0
可能,则不一定是正确的Shortest Seek Time First排序。您的算法可能看起来像这样:
Collections.sort(positions);
nextLowest
和nextHighest
位置相对于current_pos
(或currentPos
,如果遵循Java命名约定)的位置的索引positions
移除该位置并将其添加到return_array
(如果是nextLowest
,还会减少nextLowestIndex
。如果是nextHighest
},增量nextHighestIndex
)return return_array
。当然,您还需要在第3步中检查nextLowestIndex < 0
和nextHighestIndex >= positions.size()
。
请注意,在while循环中不需要for循环 - 但在进入while循环之前,您将在步骤2中使用该循环。