Visual Studio 2008 SP1でコードを最適化しています。 unorder_map
が一定時間の挿入/削除/検索で素晴らしいことを知っているので、unordered_map
を主なデータ構造として使用してコードを最適化しました。次のコードを見てください。std :: tr1 :: unordered_map :: operator []の時間効率
....
typedef std::tr1::unordered_map <__int64, int> umap_id;
const int text1_length = text1.GetLength();
const int text2_length = text2.GetLength();
const int max_d = text1_length + text2_length - 1;
const bool doubleEnd = (64 < max_d);
vector<set<pair<int, int> > > v_map1;
vector<set<pair<int, int> > > v_map2;
vector<int> v1(2 *max_d, 0);
vector<int> v2(2 *max_d, 0);
int x, y;
__int64 footstep;
umap_id footsteps(max_d * 2);
bool done = false;
const bool forward = ((text1_length + text2_length) % 2 == 1);
for (int d = 0; d < max_d; ++d)
{
// Walk forward path one step
v_map1.push_back(set<pair<int, int> >());
for (int k = -d; k <= d; k += 2)
{
if (k == -d || (k != d && v1[k - 1 + max_d] < v1[k + 1 + max_d]))
x = v1[k + 1 + max_d];
else
x = v1[k - 1 + max_d] + 1;
y = x - k;
if (doubleEnd)
{
footstep = (__int64) ((__int64)x << 32 | y);
if (!forward)
footsteps[footstep] = d;
else if (footsteps.find(footstep) != footsteps.end())
done = true;
}
....
}
}
....
しかし、まだかなり遅いことがわかります。私の比較的小さい入力(max_d
= 946)を考えると、それは20秒以上実行されます。
私はリリースビルドのプロファイラ分析を行った、とプロファイラは、その行を明らかにする:footsteps[footstep] = d;
は447931回実行し、約20秒かかった主犯です。
同じループボディ内に別のコード行があります。else if (footsteps.find(footstep) != footsteps.end())
は同じ回数(つまり447931回)実行されましたが、コストはずっと少なくなりました。
operator::[]
のunordered_map
は私にとってはブラックボックスのようです。私はなぜそれが長くかかるのか理解できませんでした。 32ビットアプリケーションです。どんな助けもありがとうございます。
どのSTL実装を使用していますか? –
Visual C++(マイクロソフト)、 – Zeiga
、::と '<', '>'が多すぎ、Cにキャストされます。タグが削除されました – pmg