Monero
Toggle main menu visibility
Loading...
Searching...
No Matches
src
common
combinator.h
Go to the documentation of this file.
1
// Copyright (c) 2018-2022, The Monero Project
2
3
//
4
// All rights reserved.
5
//
6
// Redistribution and use in source and binary forms, with or without modification, are
7
// permitted provided that the following conditions are met:
8
//
9
// 1. Redistributions of source code must retain the above copyright notice, this list of
10
// conditions and the following disclaimer.
11
//
12
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
13
// of conditions and the following disclaimer in the documentation and/or other
14
// materials provided with the distribution.
15
//
16
// 3. Neither the name of the copyright holder nor the names of its contributors may be
17
// used to endorse or promote products derived from this software without specific
18
// prior written permission.
19
//
20
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
21
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
22
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
23
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
27
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
28
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
//
30
// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
31
32
#pragma once
33
34
#include <iostream>
35
#include <vector>
36
#include <stdexcept>
37
#include <cstdint>
38
39
namespace
tools
{
40
41
uint64_t
combinations_count
(
uint32_t
k,
uint32_t
n);
42
43
template
<
typename
T>
44
class
Combinator
{
45
public
:
46
Combinator
(
const
std::vector<T>& v) :
origin
(v) { }
47
48
std::vector<std::vector<T>>
combine
(
size_t
k);
49
50
private
:
51
void
doCombine
(
size_t
from,
size_t
k);
52
53
std::vector<T>
origin
;
54
std::vector<std::vector<T>>
combinations
;
55
std::vector<size_t>
current
;
56
};
57
58
template
<
typename
T>
59
std::vector<std::vector<T>>
Combinator<T>::combine
(
size_t
k)
60
{
61
if
(k >
origin
.size())
62
{
63
throw
std::runtime_error(
"k must be smaller than elements number"
);
64
}
65
66
if
(k == 0)
67
{
68
throw
std::runtime_error(
"k must be greater than zero"
);
69
}
70
71
combinations
.clear();
72
doCombine
(0, k);
73
return
combinations
;
74
}
75
76
template
<
typename
T>
77
void
Combinator<T>::doCombine
(
size_t
from,
size_t
k)
78
{
79
current
.push_back(0);
80
81
for
(
size_t
i = from; i <=
origin
.size() - k; ++i)
82
{
83
current
.back() = i;
84
85
if
(k > 1) {
86
doCombine
(i + 1, k - 1);
87
}
else
{
88
std::vector<T> comb;
89
for
(
auto
ind:
current
) {
90
comb.push_back(
origin
[ind]);
91
}
92
combinations
.push_back(comb);
93
}
94
}
95
96
current
.pop_back();
97
}
98
99
}
//namespace tools
tools::Combinator::combine
std::vector< std::vector< T > > combine(size_t k)
Definition
combinator.h:59
tools::Combinator::combinations
std::vector< std::vector< T > > combinations
Definition
combinator.h:54
tools::Combinator::Combinator
Combinator(const std::vector< T > &v)
Definition
combinator.h:46
tools::Combinator::current
std::vector< size_t > current
Definition
combinator.h:55
tools::Combinator::doCombine
void doCombine(size_t from, size_t k)
Definition
combinator.h:77
tools::Combinator::origin
std::vector< T > origin
Definition
combinator.h:53
tools
Various Tools.
Definition
apply_permutation.h:40
tools::combinations_count
uint64_t combinations_count(uint32_t k, uint32_t n)
Definition
combinator.cpp:36
uint32_t
unsigned int uint32_t
Definition
stdint.h:126
uint64_t
unsigned __int64 uint64_t
Definition
stdint.h:136
Generated on
for Monero by
1.17.0