如何解决就时间复杂度而言,堆排序/优先级队列是否比 C++ 中的映射STL 中的有序映射更好?
这个问题困扰了我很久。
我有一个庞大的数据集,我想使用每次在整个数据集中运行 for 循环时生成的数字对该数据集进行排序。所以,我决定将该数字绑定到地图中一行的索引。这样,我间接地对数据集(它是一个二维字符串向量)进行了排序。现在有人告诉我有一种更好的方法可以做到这一点,最好是通过堆数据结构。但我不知道在这种情况下,像优先级队列这样的堆如何有帮助(除了能够打印出需要 O(n) 时间的堆中的最小元素)。我在这里严格地谈论时间复杂度。我将向您展示我拥有的代码:
` for(i = 0; i < final_dataset.size(); i+=2){
string str1 = final_dataset[i][0];
string str2 = final_dataset[i][3];
string str3 = final_dataset[i+1][3];
istringstream(str2) >> num2;
istringstream(str3) >> num3;
total_date_diff = date_calc(str1,numeric_year,numeric_month); //Calculate the difference in input date and the dates in the final_dataset
num2 = d2 - num2; //Calculate the difference in supplies
num3 = d3 - num3; //Calculate the difference in exports
euclid_result = euclid_distance_result(total_date_diff,num2,num3); //Calculate the euclidian distance for every row in the final_dataset
results.insert(pair<double,int>(euclid_result,i)); //Bind the respective euclidian distances to the row index of every row in the final_dataset
}
int k_counter = 0;
cout<<"The "<<k<<" nearest neighbors of entered data point are: \n\n";
//iterate through the map,results(key:euclidian distance,value: corresponding row index) to output the datapoints,in terms of increasing order of euclidian distances.
//Since maps are sorted automatically in ascending order,display the datapoints(taken from the rows of the final_dataset) corresponding to the first k values in the map.
for(auto itr = results.begin(); itr != results.end(); itr++){
cout<<"("<<final_dataset[itr->second][0]<<","<<final_dataset[itr->second][3]<<","
<<final_dataset[itr->second+1][3]<<")"<<" with the label: "
<<final_dataset[itr->second][1]<<"\t"<<" and Euclidian distance="<<itr->first<<"\n";
k_counter++;
if(k_counter == k) break; //once k is reached,stop iterating
}
优先队列怎么可能比我做的更快?
解决方法
关于 C++ maps 的文档说:
地图通常被实现为二叉搜索树。
这意味着插入一个键/值对的时间复杂度为 O(log?),其中 ? 是插入时映射的大小。
要插入所有键/值对,您的总时间复杂度为 O(log1 + log2 + log3 + ... + log?) = O(log(?!)) = O(?log?)
这与将键/值对存储在向量中并通过键调用 std::sort
对其进行排序所获得的时间复杂度相同。
堆
当您不需要对整个输入进行排序,但只对最少的?元素感兴趣,或者甚至可能只对最少的?th 元素。
插入堆的时间复杂度也是 O(log?),其中 ? 是插入时堆的大小。
然而,一个设计良好的基于堆的算法不需要堆包含多个?元素:一旦达到这个大小,值就会交换——时间复杂度也是 O(log?) .所以总的时间复杂度将是 O(?log?)。当?≪?时,这绝对是对O(?log?)的改进。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。