繁体   English   中英

如何摆脱固定的哨兵值(-32767)?

[英]How can I get rid of fixed sentinel value (-32767)?

下面是我编写的程序,用于查找给定数组的子数组的总和,但不知怎的,我不知道如何摆脱sentinel值(在这种情况下为-32767)? 我该如何优化它? 如何跟踪最大子阵列的范围?

#define EVALUE -32767

using namespace std;

int findMaxSubArray(vector<int>,int low,int high);
int findMaxSubArray_Mid(vector<int>,int low,int high);

int main()
{
    vector<int> v;
    int j=0;

    cout << "Enter array values(-32767 to end): ";
    while(1)
    {
        cin >> j;
        if (EVALUE==j)
            break;
        v.push_back(j);
    }

if(v.size()!=0)
    cout << "Max sum is: " << findMaxSubArray(v,0,v.size()-1) << "\n";
else
    cout << "No array elements entered, exiting...\n";

system("pause");
return 0;
}

int findMaxSubArray(vector<int> v, int low, int high)
{
    if(low==high) return v[low];

    int max_mid_sum=findMaxSubArray_Mid(v,low,high);
    int max_left_sum=findMaxSubArray(v,low,(low+high)/2);
    int max_right_sum=findMaxSubArray(v,(low+high)/2+1,high);

    if (max_mid_sum>max_left_sum) return (max_mid_sum>max_right_sum?max_mid_sum:max_right_sum);
    else return(max_left_sum>max_right_sum?max_left_sum:max_right_sum);
}

int findMaxSubArray_Mid(vector<int> v,int low,int high)
{
    int mid=high/2;
    int max_left_sum=0;
    int max_right_sum=0;
    int sum=0;

    for(int i=mid;i>=low;--i)
    {
        sum+=v[i];
        if(sum>max_left_sum)    
        {
            max_left_sum=sum;
        }
    }

    sum=0;
    for(int i=mid+1;i<=high;++i)
    {
        sum+=v[i];
        if(sum>max_right_sum)   
        {
            max_right_sum=sum;
        }
    }

    return (max_right_sum+max_left_sum);
}

从文本文件中读取时,cin将获得的最后一个字符是“EOF”字符或文件结尾字符。 您可以使用control + d在命令行中将此字符发送到您的程序。 你想要检查这个而不是-32767。

这是一个基本程序,应该为您的问题找出一个简单的解决方案:

#include <vector>
#include <iostream>

using namespace std;

int main()
{
    vector<int> v;
    int j;

    cout << "Enter array values (Control+D (EOF) to end): ";
    cin >> j;
    while(cin.good())
    {
        v.push_back(j);
        cin >> j;
    }

    return 0;
}

如果你想变得非常聪明,你可以使用下面的内容,它将直接将内存的内容(从开头直到EOF)插入到向量中。 就运行时间而言,这可能比您的解决方案和上述解决方案更快。

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

using namespace std;

int main()
{
    vector<int> v;
    cout << "Enter array values (Control+D (EOF) to end): ";

    istream_iterator<int> in(cin);
    istream_iterator<int> eof;
    copy(in, eof, back_inserter(v));

    ostream_iterator<int> out(cout, "\n");
    copy(v.begin(), v.end(), out);

    return 0;
}

关于哨兵,IIRC与Control + D你关闭标准输入(可能取决于操作系统)。 这将导致<<失败(我不知道如何,可能你必须捕获异常)。

无论如何,其余的代码只是向量的递归(二项式)添加。 你可以用一个简单的替换所有这些

for(int i = 0; i < v.size(); i++) {
  total += v[i]
}

关于max子阵列范围的问题已经由Vector类管理

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM