好吧,讓我們走了。
首先,==運算符要求採用鴿子洞方法。由於我們在[0,1000]範圍內討論int值,因此一張簡單的表格就很好。
std::vector<Bucket1> myTable(1001, /*MAGIC_1*/); // suspense
課程的想法是,你會發現在其a
屬性值......什麼魔法到目前爲止所定義的桶YourObject
實例。
現在在新的東西。
&& fooArr[i].b >= value2
&& fooArr[i].c <= value2 //yes again value2
&& fooArr[i].d <= value3
使用的value2
是棘手的,但你說你不關心空間權;)?
typedef std::vector<Bucket2> Bucket1;
/*MAGIC_1*/ <-- Bucket1(1001, /*MAGIC_2*/) // suspense ?
一個BucketA
實例將在其第i個位置的YourObject
針對yourObject.c <= i <= yourObject.b
所有實例,現在,隨着d
相同的方法。
typedef std::vector< std::vector<YourObject*> > Bucket2;
/*MAGIC_2*/ <-- Bucket2(1001)
的想法是,在std::vector<YourObject*>
第i個索引包含一個指向的YourObject
所有實例其中yourObject.d <= i
乾脆把它!
class Collection:
{
public:
Collection(size_t aMaxValue, size_t bMaxValue, size_t dMaxValue);
// prefer to use unsigned type for unsigned values
void Add(const YourObject& i);
// Pred is a unary operator taking a YourObject& and returning void
template <class Pred>
void Apply(int value1, int value2, int value3, Pred pred);
// Pred is a unary operator taking a const YourObject& and returning void
template <class Pred>
void Apply(int value1, int value2, int value3, Pred pred) const;
private:
// List behaves nicely with removal,
// if you don't plan to remove, use a vector
// and store the position within the vector
// (NOT an iterator because of reallocations)
typedef std::list<YourObject> value_list;
typedef std::vector<value_list::iterator> iterator_vector;
typedef std::vector<iterator_vector> bc_buckets;
typedef std::vector<bc_buckets> a_buckets;
typedef std::vector<a_buckets> buckets_t;
value_list m_values;
buckets_t m_buckets;
}; // class Collection
Collection::Collection(size_t aMaxValue, size_t bMaxValue, size_t dMaxValue) :
m_values(),
m_buckets(aMaxValue+1,
a_buckets(bMaxValue+1, bc_buckets(dMaxValue+1))
)
)
{
}
void Collection::Add(const YourObject& object)
{
value_list::iterator iter = m_values.insert(m_values.end(), object);
a_buckets& a_bucket = m_buckets[object.a];
for (int i = object.c; i <= object.b; ++i)
{
bc_buckets& bc_bucket = a_bucket[i];
for (int j = 0; j <= object.d; ++j)
{
bc_bucket[j].push_back(index);
}
}
} // Collection::Add
template <class Pred>
void Collection::Apply(int value1, int value2, int value3, Pred pred)
{
index_vector const& indexes = m_buckets[value1][value2][value3];
BOOST_FOREACH(value_list::iterator it, indexes)
{
pred(*it);
}
} // Collection::Apply<Pred>
template <class Pred>
void Collection::Apply(int value1, int value2, int value3, Pred pred) const
{
index_vector const& indexes = m_buckets[value1][value2][value3];
// Promotion from value_list::iterator to value_list::const_iterator is ok
// The reverse is not, which is why we keep iterators
BOOST_FOREACH(value_list::const_iterator it, indexes)
{
pred(*it);
}
} // Collection::Apply<Pred>
因此,加入和刪除項目的收藏將花費。
此外,你有(aMaxValue + 1) * (bMaxValue + 1) * (dMaxValue + 1) std::vector<value_list::iterator>
存儲,這是很多。
然而,Collection::Apply
複雜大致是Pred
k
應用中k
爲符合其參數的項目數。
我要尋找的評論在那裏,不知道我得到了所有的指標權OO
這是否實際上導致了性能問題,或者你只是假設它會?在什麼情況下使用?這個查詢運行了數萬億次,還是偶爾運行? – 2009-10-22 19:52:31
請重新設置代碼塊的格式。 – 2009-10-22 19:52:45
嚴。使用三千個整數比較優化循環看起來像是一個過早的優化。這真的是你的應用程序的緩慢部分? – sisve 2009-10-22 19:52:48