Aleph-w 3.0
A C++ Library for Data Structures and Algorithms
Loading...
Searching...
No Matches
tpl_sparse_table_test.cc
Go to the documentation of this file.
1/*
2 Aleph_w
3
4 Data structures & Algorithms
5 version 2.0.0b
6 https://github.com/lrleon/Aleph-w
7
8 This file is part of Aleph-w library
9
10 Copyright (c) 2002-2026 Leandro Rabindranath Leon
11
12 Permission is hereby granted, free of charge, to any person obtaining a copy
13 of this software and associated documentation files (the "Software"), to deal
14 in the Software without restriction, including without limitation the rights
15 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16 copies of the Software, and to permit persons to whom the Software is
17 furnished to do so, subject to the following conditions:
18
19 The above copyright notice and this permission notice shall be included in all
20 copies or substantial portions of the Software.
21
22 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28 SOFTWARE.
29*/
30
31
37# include <gtest/gtest.h>
38
39# include <tpl_sparse_table.H>
40
41# include <algorithm>
42# include <cstddef>
43# include <numeric>
44# include <utility>
45# include <vector>
46
47using namespace Aleph;
48using namespace testing;
49
50namespace
51{
52 struct Gcd_Op
53 {
54 int operator()(const int a, const int b) const noexcept
55 {
56 return std::gcd(a, b);
57 }
58 };
59
60 template <typename T, class Op>
61 T fold_range(const std::vector<T> & values,
62 const size_t l, const size_t r, Op op)
63 {
64 T acc = values[l];
65 for (size_t i = l + 1; i <= r; ++i)
66 acc = op(acc, values[i]);
67 return acc;
68 }
69} // namespace
70
72{
73 Sparse_Table<int> st(std::vector<int>{});
74
75 EXPECT_TRUE(st.is_empty());
76 EXPECT_EQ(st.size(), 0U);
77 EXPECT_EQ(st.num_levels(), 0U);
78
79 EXPECT_THROW(st.get(0), std::out_of_range);
80 EXPECT_THROW(st.query(0, 0), std::out_of_range);
81}
82
84{
86
87 EXPECT_EQ(st.size(), 16U);
89 EXPECT_EQ(st.query(0, 15), 7);
90 EXPECT_EQ(st.query(5, 11), 7);
91
92 for (size_t i = 0; i < st.size(); ++i)
93 EXPECT_EQ(st.get(i), 7);
94}
95
97{
98 const std::vector<int> values = {9, 4, 7, 1, 8, 2, 6, 3, 5, 0};
99 Sparse_Table<int> mn(values);
101
102 for (size_t l = 0; l < values.size(); ++l)
103 for (size_t r = l; r < values.size(); ++r)
104 {
105 const int expected_min = *std::min_element(values.begin() + l,
106 values.begin() + r + 1);
107 const int expected_max = *std::max_element(values.begin() + l,
108 values.begin() + r + 1);
109 EXPECT_EQ(mn.query(l, r), expected_min);
110 EXPECT_EQ(mx.query(l, r), expected_max);
111 }
112}
113
115{
116 const std::vector<int> values = {5, 3, 7, 1, 9, 2, 8, 4, 6};
118
119 Array<int> arr;
120 for (const int x : values)
121 arr.append(x);
123
124 DynList<int> list;
125 for (const int x : values)
126 list.append(x);
128
129 Sparse_Table<int> from_init = {5, 3, 7, 1, 9, 2, 8, 4, 6};
130
131 for (size_t l = 0; l < values.size(); ++l)
132 for (size_t r = l; r < values.size(); ++r)
133 {
134 const int expected = *std::min_element(values.begin() + l,
135 values.begin() + r + 1);
136 EXPECT_EQ(from_vector.query(l, r), expected);
137 EXPECT_EQ(from_array.query(l, r), expected);
138 EXPECT_EQ(from_list.query(l, r), expected);
139 EXPECT_EQ(from_init.query(l, r), expected);
140 }
141}
142
144{
145 const std::vector<int> values = {12, 18, 24, 36, 60, 48, 30, 90, 15, 45};
147
148 for (size_t l = 0; l < values.size(); ++l)
149 for (size_t r = l; r < values.size(); ++r)
150 EXPECT_EQ(st.query(l, r), fold_range(values, l, r, Gcd_Op{}));
151}
152
154{
155 const std::vector<int> base = {8, 6, 7, 5, 3, 0, 9};
156 Sparse_Table<int> st(base);
157
158 Array<int> vals = st.values();
159 ASSERT_EQ(vals.size(), base.size());
160 for (size_t i = 0; i < base.size(); ++i)
161 EXPECT_EQ(vals(i), base[i]);
162
164 EXPECT_EQ(copy.query(1, 5), 0);
165
166 Sparse_Table<int> moved = std::move(copy);
167 EXPECT_EQ(moved.query(2, 6), 0);
168
169 Sparse_Table<int> other = {100, 50, 75};
171
172 EXPECT_EQ(moved.size(), 3U);
173 EXPECT_EQ(moved.query(0, 2), 50);
174 EXPECT_EQ(other.size(), base.size());
175 EXPECT_EQ(other.query(0, 6), 0);
176}
177
179{
180 Sparse_Table<int> st = {1, 2, 3};
181
182 EXPECT_THROW(st.get(3), std::out_of_range);
183 EXPECT_THROW(st.query(0, 3), std::out_of_range);
184 EXPECT_THROW(st.query(2, 1), std::out_of_range);
185}
Simple dynamic array with automatic resizing and functional operations.
Definition tpl_array.H:139
T & append(const T &data)
Append a copy of data
Definition tpl_array.H:245
Dynamic singly linked list with functional programming support.
Definition htlist.H:1155
T & append(const T &item)
Definition htlist.H:1271
Sparse Table over an arbitrary associative and idempotent binary operation.
T get(const size_t i) const
Retrieve the value a[i] in O(1).
Array< T > values() const
Reconstruct all original values into an Array.
constexpr size_t size() const noexcept
Number of logical elements.
constexpr bool is_empty() const noexcept
True if the table contains no elements.
T query(const size_t l, const size_t r) const
Range query over [l, r] in O(1).
void swap(Gen_Sparse_Table &other) noexcept
Swap this table with other in O(1).
size_t size() const noexcept
Count the number of elements of the list.
Definition htlist.H:1065
iterator begin() noexcept
Return an STL-compatible iterator to the first element.
#define TEST(name)
Main namespace for Aleph-w library functions.
Definition ah-arena.H:89
Itor2 copy(Itor1 sourceBeg, const Itor1 &sourceEnd, Itor2 destBeg)
Copy elements from one range to another.
Definition ahAlgo.H:584
Divide_Conquer_DP_Result< Cost > divide_and_conquer_partition_dp(const size_t groups, const size_t n, Transition_Cost_Fn transition_cost, const Cost inf=dp_optimization_detail::default_inf< Cost >())
Optimize partition DP using divide-and-conquer optimization.
std::decay_t< typename HeadC::Item_Type > T
Definition ah-zip.H:105
Sparse Table for range maximum queries.
Sparse Table for range minimum queries.
int operator()(const int &a, const int &b) const noexcept
gsl_rng * r
Sparse Table for static range queries in O(1).
DynList< int > l