Maintaining a sorted list of numbers in multiset and the cumulative sums in another
我有一个应用程序,其中整数不按特定顺序呈现。呈现的整数可以是重复值。我得把它们整理好。每次显示新条目时,都需要将其放置在适当的位置,以便保持排序顺序。
现在,除了这个经过排序的多集之外,我还必须在另一个容器中维护累积和。
也就是说,如果排序的条目是:
1、5、7、9(在指数0、1、2和3中)
累积和容器为:
1、6、13、22(在指数0、1、2和3中)
我很难理解如何使用在每次
也就是说,如果必须执行上述列表中的
排序条目:
1、5、7、8、9(在指数0、1、2、3和4中)
累积金额:
1、6、13、21、30(在指数0、1、2、3和4中)。请注意,只有索引3和4中的条目受到影响。)
目前,我能够实现这一点的唯一方法是使用两个数组,一个用于值数组,一个用于累积和。实现此功能的工作代码如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | #include <iostream> int *arr = new int[100];//Array to maintain sorted list int *cum_arr = new int[100];//Array to maintain cumulative sum void insert_into_position(int val, int &last_valid_index_after_insertion) { //Inserts val into arr such that after insertion //arr[] has entries in ascending order. int postoadd = last_valid_index_after_insertion; //index in array at which to insert val //initially set to last_valid_index_after_insertion //Search from end of array until you find the right //position at which to insert val for (int ind = last_valid_index_after_insertion - 1; ind >= 0; ind--) { if (arr[ind] > val) { postoadd--; } else { break; } } //Move everything from and including postoadd one position to the right. //Update the cumulative sum array as you go for (int ind = last_valid_index_after_insertion - 1; ind >= postoadd; ind--) { arr[ind + 1] = arr[ind]; cum_arr[ind + 1] = cum_arr[ind] + val; } //Update entry in index postoadd arr[postoadd] = val; if (postoadd > 0) cum_arr[postoadd] = cum_arr[postoadd - 1] + val; else cum_arr[0] = val; last_valid_index_after_insertion++; } int main(void) { int length = 0; insert_into_position(1, length); insert_into_position(5, length); insert_into_position(7, length); insert_into_position(9, length); printf(" Print sorted array "); for (int i = 0; i < length; i++) printf("%d", arr[i]); printf(" Print Cumulative sum array "); for (int i = 0; i < length; i++) printf("%d", cum_arr[i]); insert_into_position(8, length); printf(" Print sorted array "); for (int i = 0; i < length; i++) printf("%d", arr[i]); printf(" Print Cumulative sum array "); for (int i = 0; i < length; i++) printf("%d", cum_arr[i]); getchar(); } |
从代码中可以看出,为了计算累积和,可以使用整数数组索引
是否有任何容器组合可以比两个整数数组执行得更好/更高效?
在
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #include <iostream> #include <map> int main () { std::multimap<int,int> mymultimap = { {1, 1}, {5, 6}, {7, 13}, {9, 22} }; std::multimap<int,int>::iterator it; it = mymultimap.insert (std::pair<char,int>(8, 8)); if(mymultimap.size() > 1) { it->second = std::prev(it)->second + it->second; ++it; while(it!=mymultimap.end()) { it->second = std::prev(it)->second + it->first; ++it; } } // showing contents: std::cout <<"mymultimap contains: "; for (it=mymultimap.begin(); it!=mymultimap.end(); ++it) std::cout << (*it).first <<" =>" << (*it).second << ' '; return 0; } |
输出:
1 2 3 4 5 6 | mymultimap contains: 1 => 1 5 => 6 7 => 13 8 => 21 9 => 30 |
PS:另一种方法是使用一个元素将在