从文件中的列中查找连接的元素

时间:2016-07-26 06:22:11

标签: qt

我有一些组件的列表,比如ID为1到140。 我有一个excel表,有两列数据如下:

I/p O/p
-------------
38  1
1   5
1   3
76  1
77  1
78  1
79  1
77  2
78  2
79  2
125 126
22  126
23  126
113 127
113 134
113 135
113 136

等等。我在表格中有超过5000行。

我需要计算每个组件连接的组件数。假设组件1可以是输入或输出,我需要找到连接到的组件1的总数。从上面的例子中,1总共连接7个组件,38,5,3,76,77,78,79。

我应该如何使用Qt以编程方式执行此操作?

1 个答案:

答案 0 :(得分:1)

从您的示例来看,似乎值的顺序并不重要。例如。一行包含

76 1

似乎与

相同
1 76

(至少你想用它做什么)。

最简单似乎是设置一个多图并将所有对添加到它(两次因为顺序不重要)。 E.g。

std::multi_map<int,int> values;

while (reading a line)
   {
   int firstValue = first value found on line;
   int secondValue = second value found on line;
   values.insert(std::make_pair(firstValue,secondValue));
   }

如果您想知道连接到某个值的所有值,只需在multi_map中查找:

int valueToSearchFor = ...;
auto range = values.equal_range(valuetoSearchFor);
while (range.first!=range.second)
   {
   std::cout << range.first->second << std::endl;
   ++range.first;
   }

请注意,multi_map可能包含重复项(如果输入文件中出现相同的对)。要解决这个问题,要么在循环范围内构建一个std :: set并跳过之前遇到的值,要么使用以下数据结构:

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

请记住,不同的数据结构会对内存和CPU使用产生不同的影响,因此您可能希望针对自己的特定用途优化数据结构。

如果你还想知道所有间接连接的值,建立一个包含你遇到的所有值的向量,并在循环它时迭代它(并且还使用std :: set来防止使用相同的值并且再次)。 E.g。

std::set<int> alreadyEncounteredValues;
std::vector<int> foundValues;
valueToSearchFor = ...;
foundValues.push_back(valueToSearchFor);
alreadyEncounteredValues.insert(valueToSearchFor);
for (size_t index=0;index<foundValues.size();++index)
   {
   auto thisValueToSearchFor = foundValues[index];
   for (auto range=values.equal_range(thisValueToSearchFor);range.first!=range.second;++range.first)
      {
      auto foundValue = range.first->second;
      auto insertResult = alreadyEncounteredValues.insert(foundValue);
      if (!insertResult.second)
         {
         // We already encountered this value.  Skip it.
         continue;
         }
      // New value
      foundValues.push_back(foundValue);
      }
   }

使用此方法,我们在集合中插入所有找到的值(以便于查看我们是否已经遇到该值)和向量中。我们还遍历向量,因此我们也将查找所有间接链接的值。一段时间后,索引将赶上大小,我们知道我们找到了所有间接链接的值。