gpt4 book ai didi

c++ - n 选择 k 有条件的实现

转载 作者:行者123 更新时间:2023-11-28 06:51:02 25 4
gpt4 key购买 nike

我使用了本主题中的代码 https://stackoverflow.com/a/5097100/3617657

然后我对其进行了一些编辑以处理 std::vector<std::vector<int>>相反 std::vector<int>

在我的例子中,K 有不同的值(从 1 到 4),而不是只有一个值

示例:我的数据

1 2 3 4
1 2 4
1 3

如果 k=3, 那么我数据中的每一行n 选择 k=

123
124
134
234

124

13

但我希望我的结果在 map 中,其中值表示子集的频率为:

(123, 1)
(124, 2)
(134, 1)
(234, 1)

(13, 1)

这是我的代码:

std::vector<std::vector<int>> data;

std::map <int, set<int>> CandidateSet;
typedef std::pair<set<int>, int> combo;
std::map <int, combo> CandidateSup;





void ScanData()
{
ifstream in;
in.open("mydata.txt");
/* mydata.txt
1 2 3 4 5
1 3 4 5
1 2 3 5
1 3
*/
std::string line;
int i = 0;

while (std::getline(in, line))
{
std::stringstream Sline1(line);
std::stringstream ss(line);
std::vector<int> inner;
int info;

while (ss >> info)
inner.push_back(info);

data.push_back(inner);
}
}



int main()
{
ScanData();
std::size_t k = 0;
int j = 0;
int c = 0;
int supp = 1;
int Lsize = 1;
while (Lsize <= 4)
{
for (unsigned i = 0; i < data.size(); ++i)
{
std::vector<int>::iterator items = data[i].begin();
if (Lsize > data[i].size())
k = data[i].size();
else
k = Lsize;

do
{
for (std::vector<int>::iterator items = data[i].begin(); j < k; ++items)
{
CandidateSet[c].insert(*items);
++j;
}

++c;
std::cout << "\n";
j = 0;

}
while (next_combination(data[i].begin(), data[i].begin() + k, data[i].end()));



/******************************************************************************************************************************
//here my problem
// check if the (next_combination) is already exist in CandidateSet, if yes add one to existing support

auto it = CandidateSet.begin();
set <int> A = it->second;
set <int> B;

B = CandidateSet[*items]; // I don't know how to set be as the next_combination


while (it != CandidateSet.end())
{ // if it found
if (!(A < B) && !(B < A))
{
CandidateSup[*items] = std::make_pair(A, ++supp);
break;
}
else
{ // if not found yet
++it;
A = it->second;
}
}// end while

// if it is not exist, add this new set with support =1
++c;
CandidateSup[c] = std::make_pair(B, supp);
/******************************************************************************************************************************/

}
++Lsize;

}

data.clear();





system("PAUSE");
return 0;
}

这个“combination.h”

template <typename Iterator>
inline bool next_combination(const Iterator first, Iterator k, const Iterator last)
{
/* Credits: Thomas Draper */
if ((first == last) || (first == k) || (last == k))
return false;
Iterator itr1 = first;
Iterator itr2 = last;
++itr1;
if (last == itr1)
return false;
itr1 = last;
--itr1;
itr1 = k;
--itr2;
while (first != itr1)
{
if (*--itr1 < *itr2)
{
Iterator j = k;
while (!(*itr1 < *j)) ++j;
std::iter_swap(itr1, j);
++itr1;
++j;
itr2 = k;
std::rotate(itr1, j, last);
while (last != j)
{
++j;
++itr2;
}
std::rotate(k, itr2, last);
return true;
}
}
std::rotate(first, k, last);
return false;
}

最佳答案

以下内容可能会有所帮助:( https://ideone.com/5EPuGd )

std::map<std::set<int>, int> counts;

for (std::size_t Lsize = 1; Lsize <= 4; ++Lsize)
{
for (unsigned i = 0; i < data.size(); ++i)
{
std::size_t k = std::min(Lsize, data[i].size());

do
{
std::set<int> n_k(data[i].begin(), data[i].begin() + k);
++counts[n_k];
}
while (next_combination(data[i].begin(), data[i].begin() + k, data[i].end()));
}
}

关于c++ - n 选择 k 有条件的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23964837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com