在向量中查找连续数字的更有效方法?

Posted

技术标签:

【中文标题】在向量中查找连续数字的更有效方法?【英文标题】:More efficient way to find consecutive numbers in vector? 【发布时间】:2017-06-01 22:35:19 【问题描述】:

我需要编写一个程序来按升序打印文件中特定单词的行号。该程序的示例输出为:

 Hello 1, 3, 5-6, 8, 10-15.
// 5-6 represents 5, 6 (consecutive numbers)

行号存储在已排序的vector<int> 中,没有重复。我已经创建了一个解决方案,但我的直觉告诉我我可以做得更好。我会很感激一些反馈。此外,以下代码仅处理行号。这个词是在另一种方法中找到的。

void IndexPager::createLines(vector<int>& vec, string& line)

  int start = *vec.begin(), end = -1, offset = 0; // initial offset to start

  for (vector<int>::const_iterator itr = vec.begin();
       itr != vec.end() + 1; itr++)
  
    if (*itr == start + offset && itr != vec.end())
    
      end = *itr;
      ++offset;
     // check if line numbers are consecutive and not reading at end of vector
    else // not consecutive
    
      if ((end != -1) && (end != start))
      
        line.append(intToString(start) + "-");
        line.append(intToString(end));
       // if there existed consecutive numbers, display with dash
        // must be difference of at least 1
      else // else, there were no consecutive numbers
        line.append(intToString(start));

      if (itr != vec.end()) // check if not at end of vector
        line.append(", ");
      else // reached end of vector
        line.append(".");

      start = *itr; // set start to next line number. Soft reset.
      offset = 1; // change default offset to 1. 0 for first case.
      end = -1;
     // not consecutive
   // Get all line numbers and format for proper output
 // createLines()

【问题讨论】:

如果您想要一些关于工作代码的反馈,请考虑将其发布到codereview.stackexchange.com。但是,您必须包含一个完全可编译的解决方案;阅读帮助中心:codereview.stackexchange.com/help 【参考方案1】:

一些观察。

    您假设向量长度 > 0 vec.end()+1 可能不会给您预期的结果,具体取决于向量实现。

在循环体的开头而不是结尾使用 for 增加 itr 可以解决这两个问题。

关于效率,你可以尝试用“next”替换“start+offset”

void IndexPager::createLines(vector<int>& vec, string& line)

    int start,end,next;
    vector<int>::const_iterator itr = vec.begin();
    next=end=start=*itr;
    while(itr!=vec.end())
    
        ++itr;
        end=next++;
        if(itr==vec.end()||next!=*itr)
        
            // break in consecutive sequence
            line.append(intToString(start));
            if(end!=start)
                line.append("-");
                line.append(intToString(end));
            
            if(itr!=vec.end())
            
                line.append(", ");
            
            next=end=start=*itr;
        
     // Get all line numbers and format for proper output
    line.append(".");
 // createLines()

itr 仍然在每次迭代中检查 vec.end() 三次,因此您可能希望在循环结束时重复中断序列部分并使用普通的 for(auto i:vec) 代替,但是说编译器优化可能会消除重复

【讨论】:

以上是关于在向量中查找连续数字的更有效方法?的主要内容,如果未能解决你的问题,请参考以下文章

在向量中找到最长的“连续数字”条纹的最快方法是啥?

基于连续阈值查找分类指标向量

在winsock中重用向量作为数组的更有效方法?

查找一组 n 个连续数字是不是在 SQL 中重复

上采样:在向量的每个连续元素之间插入额外的值

检测数字序列中的间隙是随机的还是连续的