C++ 提高时间复杂度

C++ Improve time complexity

求教如何提高程序的时间复杂度。 我无法更改接口(函数头)

比如我在find()之前做sort,会有什么影响吗? 或者我的代码是否有任何替代方案。

谢谢大家的建议

在link整个程序中,这里是部分代码 https://onecompiler.com/cpp/3xxpa4w9q

bool Company::operator == (Company cmpx)  const
{ 

    return ( ( (strcasecmp(addr.c_str(), cmpx.addr.c_str()) == 0) 
            && (strcasecmp(name.c_str(), cmpx.name.c_str()) == 0) )
            || (id == cmpx.id)
    );
    
}

void CVATRegister::sortI (vector<unsigned int> &TotalInvoice) const 
{
    sort(TotalInvoice.begin(), TotalInvoice.end(), greater<unsigned int>());
}

bool CVATRegister::cancelCompany  ( const string  &name, const string &addr )
{
    Company cmp(name, addr, "-1");
    auto itr = find(DCompany.begin(), DCompany.end(), cmp);

    if(itr != DCompany.end())
     {   
        DCompany.erase(itr);
        return true;
     }
     
     return false;
}

bool CVATRegister::newCompany ( const string &name, const string &addr, const string &taxID )
{
    Company cmp(name, addr, taxID);
    if ( find(DCompany.begin(), DCompany.end(), cmp) == DCompany.end() )
    {
        DCompany.push_back(cmp);
        return true;
    }
    return false;
}

bool CVATRegister::invoice ( const string &taxID, unsigned int amount )
{
    Company cmp("", "", taxID);

    auto itr = find(DCompany.begin(), DCompany.end(), cmp);

    if(itr != DCompany.end())
     {   
        TotalInvoice.push_back(amount);
        DCompany[distance(DCompany.begin(), itr)].saveInvoice(amount);
        return true;
     }
     
     return false;    
}

bool CVATRegister::audit ( const string &name, const string  &addr, unsigned int &sumIncome ) const
{
    Company cmp(name, addr,"-1");

    auto itr = find(DCompany.begin(), DCompany.end(), cmp);

    if(itr != DCompany.end())
     {   
        sumIncome = DCompany[distance(DCompany.begin(), itr)].getTotalIncome();
        return true;
     }
     return false;
}

void CVATRegister::sortC (vector<Company> &c) const
{
   sort(c.begin(), c.end());
}


bool CVATRegister::firstCompany ( string &name, string &addr ) const
{
    vector<Company> tmp = DCompany;
    sortC(tmp);

    if( tmp.size() > 0 )
    {   
        name = tmp[0].getName();
        addr = tmp[0].getAddr();
        return true;
    }
    return false;
} 

您正在将公司存储在向量中。在多种方法中,对向量进行排序和搜索。

  • 如果向量已经排序,请不要再次排序
  • 正如所指出的,使用二进制搜索而不是 std::find
  • 或使用 hash-based 容器,例如std::unordered_set 存储公司。这应该使大多数操作平均为 O(1)。
  • 或使用多个容器,accessing/updating每个容器都需要
  • 或自己编写 :)