2011-03-21 94 views
1

我试图弄清楚以下问题的最优实现:什么数据结构用于对象的评估顺序?

比方说,我们有一个类A代表一个复杂的数学对象,并在建设初期持有所有需要的内在状态。对于A的每个对象a_i,可以计算最终数值,该数值取决于其他a_jj < i的非平凡方式,并且a_0是已知的。此外,导致最终答案的公式需要特殊的评估顺序,并且可以定义a_i的比较运算符。

我想要做的是首先创建所有需要的a_i,将它们推入一些有序数据结构,最后以正确的顺序遍历结构以获得最终结果。

现在到了真正的问题:我使用哪种数据结构来以一般方式实现评估顺序结构?二进制堆?或者我只是简单地使用std :: vector并在之后进行排序?

谢谢!

+0

这个问题太抽象了,我不能提供具体的答案。但是,std :: set或std :: multiset可能是您的问题的良好数据结构。 – 2011-03-21 16:42:05

回答

1

如果可以根据评估顺序定义a_i的比较运算符(比如小于),那么自然容器就是std :: set。使用std :: set :: iterator遍历映射将按递增顺序产生每个a_i,这将是您的评估顺序。例如。

std::set<A> aMap; 
A a_i; 
... // You create the rest of the A's 
aMap.insert(a_i); 
aMap.insert(a_j); 

for (std::set<A>::iterator aIter = aMap.begin(); aIter != aMap.end(); ++aIter) { 
    // Do your evaluation 
} 
0

我会推荐使用矢量,以及交换功能。如果数学公式返回true,则遍历数组中的每个元素并与数组中的前一个元素交换。

您的循环将不得不循环遍历向量中的每个元素,并且还有一个循环,通过循环遍历当前索引的向量项之前的所有元素。这个内部循环将包含你的数学公式检查,即排序逻辑。

希望这可以让你知道该怎么做。如果你需要一些伪代码,给我发一条评论。