Binary search用於搜索平均複雜度爲O(log n)
的排序數據。在std::vector中,您可以使用insert()方法明確地在所需位置插入值(只要它有效)。現在
,你的任務:
當添加一個新的約會,使用二進制搜索找到它應該在矢量插入。如果與其他約會衝突,請不要添加它。
一般的做法是:
struct Appointment
{
Date date;
Time begin;
Time end;
//other required members
};
現在,這本書本身:
class AppointmentsBook
{
private:
typedef std::vector<Appointment> ApVec;
ApVec _appointments;
public:
//constructors, finding methods etc.
bool add(const Appointment& ap);
};
bool AppointmentsBook::add(const Appointment& ap)
{
ApVec::iterator pos = this->find_insert_position(ap); //find_insert_position implements searching using binary search algo
if((pos != this->_appointments.end()) && (ap->date == pos->date) && intersects(ap.begin, ap.end, pos->begin, pos->end))
{
return false;
}
else
{
this->_appointments.insert(pos, ap);
return true;
}
}
這是僞代碼,當然。函數應該檢查兩個時間範圍是否相互衝突。
請注意,如果你被允許使用某些功能,從std
庫,你可以使用std::lower_bound,它使用二進制搜索,需要的元素是部分有序:
區間[first,last)中必須至少部分排序,即相對於表達式element < value
或comp(element, value)
進行分區。
哦,還有一件事:如果你想知道,爲什麼裏面add()
檢查條件:
`if(pos != this->_appointments.end())`
空書(因此,空_appointments
載體),find_insert_position()
應該返回this->_appointments.end()
,信號,表示沒有任命。然後,其他檢查可以(並且應該!)被省略,並且新的約會被插入到該向量的末尾。
使用std::lower_bound
,你find_insert_position()
功能看起來是這樣的:
AppointmentsBook::ApVec::iterator AppointmentsBook::find_insert_position(const Appointment& ap)
{
if(this->_appointments.empty())
return this->_appointments.end();
return std::lower_bound(this->_appointments.begin(), this->_appointments.end(), ap);
}
您不僅可以使用二進制搜索查找矢量中的特定值,還可以找到值爲*的位置,如果它已經在那裏*。 (放棄你的「解決方案」 - 你不應該使用'push_back',所以它不是一個解決方案。) – molbdnilo
@molbdnilo好的,謝謝。我不確定'push_back',所以我可能不得不使用'std :: vector :: insert'成員函數呢? – nenko182
是的,你應該。查看我的答案,瞭解此任務的可能邏輯。 –