从文件

时间:2017-01-31 13:47:41

标签: c++ algorithm sorting

我在磁盘中保存了一个长度为N的二进制文件中的数组。数组的每个元素都是唯一,其值介于1N之间。数组中1N 之间的所有值 。我想在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)时间内运行

1 个答案:

答案 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)
    ....
}