NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
leonardo_heap.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_ALGORITHM_LEONARDO_HEAP_HPP__
2#define NEFORCE_CORE_ALGORITHM_LEONARDO_HEAP_HPP__
3
11
14NEFORCE_BEGIN_NAMESPACE__
15
21
115
127template <typename Iterator>
128void adjust_leonardo_heap(Iterator first, size_t current_heap, int level_index, vector<int>& levels) {
129 static_assert(is_ranges_rnd_iter_v<Iterator>, "Iterator must be random_access_iterator");
130
131 size_t child_heap1;
132 size_t child_heap2;
133 while (level_index > 0) {
134 size_t prev_heap = current_heap - leonardo(levels[level_index]);
135 if (*(first + current_heap) < *(first + prev_heap)) {
136 if (levels[level_index] > 1) {
137 child_heap1 = current_heap - 1 - leonardo(levels[level_index] - 2);
138 child_heap2 = current_heap - 1;
139 if (*(first + prev_heap) < *(first + child_heap1)) {
140 break;
141 }
142 if (*(first + prev_heap) < *(first + child_heap2)) {
143 break;
144 }
145 }
146 _NEFORCE iter_swap(first + current_heap, first + prev_heap);
147 current_heap = prev_heap;
148 --level_index;
149 } else {
150 break;
151 }
152 }
153 int current_level = levels[level_index];
154 while (current_level > 1) {
155 size_t max_child = current_heap;
156 child_heap1 = current_heap - 1 - leonardo(current_level - 2);
157 child_heap2 = current_heap - 1;
158
159 if (*(first + max_child) < *(first + child_heap1)) {
160 max_child = child_heap1;
161 }
162 if (*(first + max_child) < *(first + child_heap2)) {
163 max_child = child_heap2;
164 }
165
166 if (max_child == child_heap1) {
167 _NEFORCE iter_swap(first + current_heap, first + child_heap1);
168 current_heap = child_heap1;
169 --current_level;
170 } else if (max_child == child_heap2) {
171 _NEFORCE iter_swap(first + current_heap, first + child_heap2);
172 current_heap = child_heap2;
173 current_level -= 2;
174 } else {
175 break;
176 }
177 }
178}
179
188template <typename Iterator>
189void push_leonardo_heap(Iterator first, Iterator last) {
190 static_assert(is_ranges_rnd_iter_v<Iterator>, "Iterator must be random_access_iterator");
191
192 if (first == last) {
193 return;
194 }
195 const size_t size = _NEFORCE distance(first, last);
196 vector<int> levels = {1};
197 int toplevel = 0;
198 for (size_t i = 1; i < size - 1; ++i) {
199 if (toplevel > 0 && levels[toplevel - 1] - levels[toplevel] == 1) {
200 --toplevel;
201 ++levels[toplevel];
202 } else if (levels[toplevel] != 1) {
203 ++toplevel;
204 levels.push_back(1);
205 } else {
206 ++toplevel;
207 levels.push_back(0);
208 }
209 }
210 if (toplevel > 0 && levels[toplevel - 1] - levels[toplevel] == 1) {
211 --toplevel;
212 ++levels[toplevel];
213 } else if (levels[toplevel] != 1) {
214 ++toplevel;
215 levels.push_back(1);
216 } else {
217 ++toplevel;
218 levels.push_back(0);
219 }
220 _NEFORCE adjust_leonardo_heap(first, size - 1, toplevel, levels);
221}
222
231template <typename Iterator>
232void pop_leonardo_heap(Iterator first, Iterator last) {
233 static_assert(is_ranges_rnd_iter_v<Iterator>, "Iterator must be random_access_iterator");
234
235 if (first == last) {
236 return;
237 }
238 const size_t size = _NEFORCE distance(first, last);
239 vector<int> levels = {1};
240 int toplevel = 0;
241 for (size_t i = 1; i < size; ++i) {
242 if (toplevel > 0 && levels[toplevel - 1] - levels[toplevel] == 1) {
243 --toplevel;
244 ++levels[toplevel];
245 } else if (levels[toplevel] != 1) {
246 ++toplevel;
247 levels.push_back(1);
248 } else {
249 ++toplevel;
250 levels.push_back(0);
251 }
252 _NEFORCE adjust_leonardo_heap(first, i, toplevel, levels);
253 }
254 if (levels[toplevel] <= 1) {
255 --toplevel;
256 } else {
257 --levels[toplevel];
258 levels.push_back(levels[toplevel] - 1);
259 ++toplevel;
260 _NEFORCE adjust_leonardo_heap(first, size - 2 - leonardo(levels[toplevel]), toplevel - 1, levels);
261 _NEFORCE adjust_leonardo_heap(first, size - 2, toplevel, levels);
262 }
263}
264
273template <typename Iterator>
274void sort_leonardo_heap(Iterator first, Iterator last) {
275 static_assert(is_ranges_rnd_iter_v<Iterator>, "Iterator must be random_access_iterator");
276
277 if (first == last) {
278 return;
279 }
280 const size_t size = _NEFORCE distance(first, last);
281 vector<int> levels = {1};
282 int toplevel = 0;
283 for (size_t i = 1; i < size; ++i) {
284 if (toplevel > 0 && levels[toplevel - 1] - levels[toplevel] == 1) {
285 --toplevel;
286 ++levels[toplevel];
287 } else if (levels[toplevel] != 1) {
288 ++toplevel;
289 levels.push_back(1);
290 } else {
291 ++toplevel;
292 levels.push_back(0);
293 }
294 _NEFORCE adjust_leonardo_heap(first, i, toplevel, levels);
295 }
296 for (size_t i = size - 2; i > 0; --i) {
297 if (levels[toplevel] <= 1) {
298 --toplevel;
299 } else {
300 --levels[toplevel];
301 levels.push_back(levels[toplevel] - 1);
302 ++toplevel;
303
304 _NEFORCE adjust_leonardo_heap(first, i - leonardo(levels[toplevel]), toplevel - 1, levels);
305 _NEFORCE adjust_leonardo_heap(first, i, toplevel, levels);
306 }
307 }
308}
309
318template <typename Iterator>
319void make_leonardo_heap(Iterator first, Iterator last) {
320 static_assert(is_ranges_rnd_iter_v<Iterator>, "Iterator must be random_access_iterator");
321
322 if (first == last) {
323 return;
324 }
325 const size_t size = _NEFORCE distance(first, last);
326 vector<int> levels = {1};
327 int toplevel = 0;
328
329 for (size_t i = 1; i < size; ++i) {
330 if (toplevel > 0 && levels[toplevel - 1] - levels[toplevel] == 1) {
331 --toplevel;
332 ++levels[toplevel];
333 } else if (levels[toplevel] != 1) {
334 ++toplevel;
335 levels.push_back(1);
336 } else {
337 ++toplevel;
338 levels.push_back(0);
339 }
340 _NEFORCE adjust_leonardo_heap(first, i, toplevel, levels);
341 }
342}
343 // LeonardoHeap
345 // StandardAlgorithms
347
348NEFORCE_END_NAMESPACE__
349#endif // NEFORCE_CORE_ALGORITHM_LEONARDO_HEAP_HPP__
动态大小数组容器
NEFORCE_CONSTEXPR20 void push_back(const T &value)
在末尾拷贝插入元素
NEFORCE_INLINE17 constexpr bool is_ranges_rnd_iter_v
检查是否为范围随机访问迭代器
constexpr iter_difference_t< Iterator > distance(Iterator first, Iterator last)
计算两个迭代器之间的距离
void pop_leonardo_heap(Iterator first, Iterator last)
从莱昂纳多堆中弹出最大元素
void sort_leonardo_heap(Iterator first, Iterator last)
使用莱昂纳多堆进行排序
void push_leonardo_heap(Iterator first, Iterator last)
向莱昂纳多堆中推入元素
void adjust_leonardo_heap(Iterator first, size_t current_heap, int level_index, vector< int > &levels)
调整莱昂纳多堆
void make_leonardo_heap(Iterator first, Iterator last)
构建莱昂纳多堆
NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14 uint64_t leonardo(const uint32_t n) noexcept
计算莱昂纳多数
constexpr void iter_swap(Iterator1 a, Iterator2 b) noexcept(noexcept(_NEFORCE swap(*a, *b)))
交换迭代器指向的元素
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
数学函数库
动态大小数组容器