gpt4 book ai didi

c++ - 我应该使用什么样的数据结构来实现 UPGMA?

转载 作者:搜寻专家 更新时间:2023-10-31 02:06:22 25 4
gpt4 key购买 nike

我要提前道歉,因为我不知道怎么问这个问题,否则我的标题会更好。

我正在尝试实现 UPGMA Algorithm from Wikipedia .假设我有一个整数 vector 的 vector 。

std::vector<std::vector<int>> test = { {0},{1},{2},{3},{4},{5}}

整数代表我程序中的特定字符串。现在,假设我有特定的输入告诉我合并 test[0]test[3]一起,一旦它们被合并,我们将合并的 vector 推回到最后,我们删除 test[0]test[3]看起来像这样:

test = { {1}, {2}, {4}, {5}, {0,3} }

这可以通过以下代码轻松实现:

int x = 0;
int y = 3;
merge = {test[x][0],test[y][0]}; // merge is a std::vector<int>
test.push_back(merge);
test.erase(test.begin() + x)
test.erase(test.begin() + y - 1); // -1 since the first erase shifts everything over

当我想合并时出现问题test[1]test[4] .期望的结果看起来像这样:

test = { {1}, {4}, {5}, {2,{0,3} };

这是我遇到问题的地方,因为我现在似乎已经引入了一个 std::vector<std:vector<int>>进入我测试的位置 3。并使用 merge = {test[x][0],test[y][0]}将失败。随着时间的推移,这种情况会变得更糟。因为我可能有一些可能看起来像这样的东西:

test = { {1}, {{4,5},{2,{0,3}}} }

我想我很快意识到我为此使用了错误的数据结构,但我完全不知道我需要为此使用什么数据结构。我可以使用什么样的数据结构来轻松实现这一点?

再次,对于这个糟糕的问题,我深表歉意。

最佳答案

你正在构建一个二叉树。每个 child 要么是一个 int 要么是一个子树。这在任何东西的 vector 中都没有用处建模。

#include <vector>
#include <variant>
#include <memory>
#include <utility>

using Node = std::variant<std::shared_ptr<class Tree>, int>;

struct Tree {
Tree(Node left, Node right) : left(left), right(right) {}
Node left;
Node right;
};

std::pair<std::vector<Node>::iterator, std::vector<Node>::iterator> decide_merge(const std::vector<Node> & v)
{
// Some process to choose elements
return { v.begin(), v.begin() + 1 };
}

int main()
{
std::vector<Node> nodes = { {0}, {1}, {2}, {3}, {4}, {5} };
while (nodes.size() > 1)
{
auto [left, right] = decide_merge(nodes);
auto tree = std::make_shared<Tree>(*left, *right);
nodes.erase(left);
nodes.erase(right);
nodes.push_back(tree);
}
}

关于c++ - 我应该使用什么样的数据结构来实现 UPGMA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50405621/

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