diff --git a/src/bsb/L33.hpp b/src/bsb/L33.hpp index 368148e..9561d99 100644 --- a/src/bsb/L33.hpp +++ b/src/bsb/L33.hpp @@ -13,6 +13,7 @@ #include #include #include +#include namespace GMS { @@ -177,8 +178,7 @@ class L33 { // cerr< "<(val)<<' '<(val)<<' - // '<(val)< "<(val)<<' '<(val)<<' '<(val)< Pull() { BLOCK S0, S1; + // auto it = D0.begin(); + // while (S0.size() < M + 1 && it != D0.end()) { + // S0.splice(S0.end(), *it->second); + // blocks.erase(it->second); + + // it = D0.erase(it); + // } + + // it = D1.begin(); + // while (S1.size() < M + 1 && it != D1.end()) { + // S1.splice(S0.end(), *it->second); + // blocks.erase(it->second); + + // UB.erase(it->first); + // it = D1.erase(it); + // } + auto it = D0.begin(); while (S0.size() < M + 1 && it != D0.end()) { - S0.splice(S0.end(), *it->second); - blocks.erase(it->second); - - it = D0.erase(it); + auto& block = *it->second; + for (auto& kv : block) S0.insert(S0.end(), kv); + it++; } it = D1.begin(); while (S1.size() < M + 1 && it != D1.end()) { - S1.splice(S0.end(), *it->second); - blocks.erase(it->second); - - UB.erase(it->first); - it = D1.erase(it); + auto& block = *it->second; + for (auto& kv : block) S1.insert(S1.end(), kv); + it++; } KV_LIST S; @@ -277,15 +291,9 @@ class L33 { for (auto& item : S0) S.emplace_back(std::move(item)); for (auto& item : S1) S.emplace_back(std::move(item)); - for (auto [a, b] : S) ptr.erase(a); - - if (D1.empty()) { - auto it_BLIST = blocks.emplace(blocks.end()); - auto it_ILIST = D1.emplace(D1.end(), B, it_BLIST); - UB[B] = it_ILIST; - } - if (S.size() <= M) { + for (auto [a, b] : S) Delete(a); + K_LIST s; s.reserve(S.size()); for (auto [a, b] : S) s.push_back(a); @@ -303,11 +311,14 @@ class L33 { // for (auto [a, b] : S) cerr<(b)<<' '<(b)<<' // '<(b)<second; - VALUE x = R.front().second; - for (auto [a, b] : R) x = min(x, b); + while (nth != S.end()) { + x = min(x, nth->second); + nth++; + } + S.resize(M); // cerr<<"DEBUG M!! : "< #include +using uint = unsigned int; + TEST(L33_test, debug_small) { const unsigned seed = 998244353; const uint N = 10, M = 1, MX = 1e9; @@ -11,52 +13,50 @@ TEST(L33_test, debug_small) { std::mt19937 gen(seed); std::uniform_int_distribution dis(1, MX); - GMS::L33 D(M, MX); - std::map mp; + GMS::L33 D(M, MX); + std::map mp; std::vector keys; - for(int i=1;i<=N;i++) keys.push_back(i); + for (uint i = 1; i <= N; i++) keys.push_back(i); std::shuffle(keys.begin(), keys.end(), gen); - for(auto key:keys) - { + for (auto key : keys) { int val = dis(gen); - std::cerr< dis(1, MX); @@ -65,20 +65,22 @@ TEST(L33_test, DISABLED_emptying_test1) { GMS::L33 D(M, inf); std::vector vec; - for (int i = 1; i <= N; i++) vec.push_back(i); + for (uint i = 1; i <= N; i++) vec.push_back(i); std::shuffle(vec.begin(), vec.end(), gen); - for (int i = 0; i < N; i++) { + for (uint i = 0; i < N; i++) { D.Insert(vec[i], valdis(gen)); } - int cnt = 0; double bef = -inf; + int cnt = 0; + double bef = -inf; - while(!D.empty()) - { + while (!D.empty()) { auto [B, v] = D.Pull(); // std::cerr< valdis(-inf, inf); + + GMS::L33 D(M, inf); + + std::vector vec; + for (uint i = 1; i <= N; i++) vec.push_back(i); + + std::shuffle(vec.begin(), vec.end(), gen); + + std::vector > v; + for (uint i = 0; i < N; i++) { + v.push_back({vec[i], valdis(gen)}); + } + + D.BatchPrepend(v); + // D._debug(std::cerr); + + int cnt = 0; + double bef = -inf; + + while (!D.empty()) { + auto [B, v] = D.Pull(); + cnt += v.size(); + + EXPECT_TRUE(D.empty() || (v.size() == M)); + EXPECT_LE(bef, B); + bef = B; + } + + EXPECT_EQ(cnt, N); + + int result = 2 + 2; + EXPECT_EQ(result, 4); +} + +TEST(L33_test, emptying_test3) { + const double inf = 10099990; + const unsigned seed = 999244153; + const uint N = 2320080, M = 180000; + + std::mt19937 gen(seed); + std::uniform_real_distribution valdis(-inf, inf); + + GMS::L33 D(M, inf*2); + + std::vector vec; + for (uint i = 1; i <= N; i++) vec.push_back(i); + + std::shuffle(vec.begin(), vec.end(), gen); + + std::vector > v; + std::set keys; + for (uint i = 0; i < N; i++) { + D.Insert(vec[i], valdis(gen) + inf); + keys.insert(vec[i]); + + v.push_back({vec[i]+N/2, valdis(gen)}); + keys.insert(vec[i]+N/2); + } + + D.BatchPrepend(v); + + int cnt = 0; + double bef = -inf; + + while (!D.empty()) { + auto [B, v] = D.Pull(); + cnt += v.size(); + + EXPECT_TRUE(D.empty() || (v.size() == M)); + EXPECT_LE(bef, B); + bef = B; + } + + EXPECT_EQ(cnt, keys.size()); + + int result = 2 + 2; + EXPECT_EQ(result, 4); +}