Correction: L33

This commit is contained in:
2025-11-28 06:53:14 +09:00
parent c97093fe46
commit fcf4199c06
2 changed files with 168 additions and 69 deletions

View File

@@ -4,6 +4,8 @@
// #include <limits>
#include <random>
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<int> dis(1, MX);
GMS::L33<int,int> D(M, MX);
std::map<int,int> mp;
GMS::L33<int, int> D(M, MX);
std::map<int, int> mp;
std::vector<int> 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<<key<<": "<<val<<std::endl;
// std::cerr<<key<<": "<<val<<std::endl;
mp[val] = key;
D.Insert(key, val);
}
std::cerr<<"[!] mp: "<<std::endl;
for(auto [val, key] : mp)
std::cerr<<key<<": "<<val<<std::endl;
// std::cerr<<"[!] mp: "<<std::endl;
// for(auto [val, key] : mp)
// std::cerr<<key<<": "<<val<<std::endl;
D._debug(std::cerr);
std::cerr<<"[!] D: "<<std::endl;
// D._debug(std::cerr);
// std::cerr<<"[!] D: "<<std::endl;
int bef = 0;
while(!D.empty())
{
while (!D.empty()) {
auto [B, keys] = D.Pull();
std::cerr<<"[!] new pull; B : "<<B<<" ("<<keys.size()<<')'<<": ";
for(auto i:keys) std::cerr<<i<<' ';
std::cerr<<std::endl;
// std::cerr<<"[!] new pull; B : "<<B<<" ("<<keys.size()<<')'<<": ";
// for(auto i:keys) std::cerr<<i<<' ';
// std::cerr<<std::endl;
// D._debug(std::cerr);
D._debug(std::cerr);
EXPECT_LT(bef, B);
bef = B;
std::cerr<<std::endl;
// std::cerr<<std::endl;
}
}
TEST(L33_test, DISABLED_emptying_test1) {
const double inf = 100;
TEST(L33_test, emptying_test1) {
const double inf = 1000;
const unsigned seed = 998244353;
const uint N = 2328, M = 10, MX = 1e9;
const uint N = 232800, M = 170, MX = 1e9;
std::mt19937 gen(seed);
std::uniform_int_distribution<int> dis(1, MX);
@@ -65,20 +65,22 @@ TEST(L33_test, DISABLED_emptying_test1) {
GMS::L33<int, double> D(M, inf);
std::vector<int> 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<<B<<' '<<v.size()<<std::endl;
// for(auto i:v) std::cerr<<i<<' ';
// std::cerr<<std::endl;
cnt += v.size();
EXPECT_TRUE(D.empty() || (v.size() == M));
@@ -91,3 +93,89 @@ TEST(L33_test, DISABLED_emptying_test1) {
int result = 2 + 2;
EXPECT_EQ(result, 4);
}
TEST(L33_test, emptying_test2) {
const double inf = 1000;
const unsigned seed = 993244853;
const uint N = 2320000, M = 1700000;
std::mt19937 gen(seed);
std::uniform_real_distribution<double> valdis(-inf, inf);
GMS::L33<int, double> D(M, inf);
std::vector<int> vec;
for (uint i = 1; i <= N; i++) vec.push_back(i);
std::shuffle(vec.begin(), vec.end(), gen);
std::vector<std::pair<int, double> > 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<double> valdis(-inf, inf);
GMS::L33<int, double> D(M, inf*2);
std::vector<int> vec;
for (uint i = 1; i <= N; i++) vec.push_back(i);
std::shuffle(vec.begin(), vec.end(), gen);
std::vector<std::pair<int, double> > v;
std::set<int> 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);
}