我在磁盘中保存了一个长度为N
的二进制文件中的数组。数组的每个元素都是唯一,其值介于1
到N
之间。数组中1
到N
之间的所有值 。我想在C ++中创建一个函数,它接收索引(从零开始),idx
长度为n
的向量,并从索引处获取的二进制文件中返回已排序的元素。
示例:
// saved_array = [2,6,4,10,7,1,9,3,5,8] with N = 10
idx = [0,5,8]; // zero-based index
readAndSortedArray(idx); // returns [1,2,5]
第0个元素是2
,第5个元素是1
,第8个元素是5
。变量idx
始终排序,但保存的数组未排序。 idx
的长度约为N
的1%,N
的典型值为10,000。
我的代码目前如下。
vector<int> readAndSortedArray(vector<int> idx) {
vector<int> elements(idx.size());
for (int i = 0; i < idx.size(); i++) {
elements[i] = read_element_from_file(idx[i]);
}
sort(elements.begin(), elements.end());
return elements;
}
由于该函数将被多次调用(百万次),我想有效地实现它。
关于如何改进上述算法的任何想法?
我的一些想法是:
O(n^2)
中运行时间(一次插入需要O(n)
次)N
的空数组,标记新元素的位置,最后从数组中提取非零的元素,这将在O(N)
时间内运行答案 0 :(得分:2)
这里最简单的优化思想是读取一次数组然后重复使用它:
vector <int> readArray() { /* some code to read it from file */ }
vector<int> sortedArray(const vector<int>& arr, const vector<int>& idx) {
vector<int> elements(idx.size());
for (int i = 0; i < idx.size(); i++) {
elements[i] = arr[idx[i]];
}
sort(elements.begin(), elements.end());
return elements;
}
然后在某处
vector<int> arr(readArray());
for (/* yor loop */) {
....
some_vec = sortedArray(arr,some_idx)
....
}