餐厅顾客峰值问题O(n)优化算法的正确性验证请求
餐厅顾客峰值问题:O(n)扫线算法实现验证请求
我正在研读算法相关书籍,认为可将餐厅顾客峰值问题的**扫线算法(sweep line algorithm)**优化至O(n)时间复杂度。以下是书中的扫线算法原文及我的C++实现代码,恳请各位帮忙验证该方案是否正确。
书中扫线算法原文
扫线算法将问题建模为一组按排序顺序处理的事件。例如,假设我们知道某餐厅一天内所有顾客的到达和离开时间,任务是找出同一时间在店的最大顾客数。
例如,图4.7展示了一个包含A、B、C、D四位顾客的问题实例,此时同一时间在店的最大顾客数为3,出现在A到达至B离开的时间段内。为解决该问题,我们为每位顾客创建两个事件:一个到达事件和一个离开事件。随后对事件排序,并按时间顺序遍历。为找到最大顾客数,我们维护一个计数器,顾客到达时计数器加1,离开时减1,计数器的最大值即为问题答案。
图4.8展示了该示例场景中的事件:每位顾客对应两个事件,“+”表示顾客到达,“−”表示顾客离开。该算法的时间复杂度为O(n log n),因为事件排序的时间复杂度为O(n log n),扫线遍历部分为O(n)。
我的O(n)时间复杂度C++实现代码
bitset<8> eve; // 1 for customer have arrived // 0 for customer have left eve[0] = eve[1] = eve[2] = eve[5] = 1; eve[3] = eve[4] = eve[6] = eve[7]; int cnt = 0, best = 0; for (int i = 0; i < eve.size(); ++i) { if (eve.test(i) == 0) { --cnt; best = max(best, cnt); } else { ++cnt; best = max(best, cnt); } } cout << best << '\n';
内容的提问来源于stack exchange,提问作者Rahul Gupta
相关产品推荐
相关产品推荐

