我有一个第一行的文件,我想用扫描算法(电梯)来计算总距离。
队列大小为32,总数据行为35691
左端是0
,右端是59999
ex:
queue size is 3
start from 0
left end is 0
right end is 255
all request:30, 150, 30, 10, 70
1.
head:0
quene:30, 150, 30
distance:0
2.
head:30
quene:150, 30, 10
distance:30
3.
head:30
quene:150, 10, 70
distance:30
4.
head:70
quene:150, 10
distance:70
5.
head:150
quene:10
distance:150
6.
head:10
quene:
distance:500(150 to right end 255 and come back to 10 --> 150 + (255 - 150) * 2 + (150 - 10))
我所做的是以下代码,我使用多组来存储它,
the first stage I fill up the queue
the second stage I insert the next element first
if the direction is right now
to see whether there is element next to the current, if not, change the direction, else keep right moving.
if the direction is left now
do the same thing above but go to left
the third stage I will calculate the remaining element in the queue.
我遇到的问题是我在
中计算的距离second stage is larger the result
,所以可能有些不对劲。我认为我认为是正确的,我无法弄清楚
错误在哪里。
最终结果应为33055962。
代码:
#include <iostream>
#include <fstream>
#include <string>
#include <set>
const int dataSize = 35691;
const int queueSize = 32;
const int minNumber = 0;
const int maxNumber = 59999;
using namespace std;
int number = minNumber;
int direction = 1;// right
int distanceSum = 0;
multiset<int> myset;
multiset<int>::iterator it;
multiset<int>::iterator temp;
multiset<int>::iterator next;
void print(void);
int main(int argc, char const *argv[]){
ifstream myfile("sort");
if (myfile.is_open()){
// ===============================initialization===============================
for(int i = 0; i < queueSize; i ++){
myfile >> number;
myset.insert(number);
}
it = myset.begin();
int last = minNumber;
int current = *it;
// ===============================middle stage===============================
for(int i = 0; i < dataSize - queueSize; i ++){
myfile >> number;
myset.insert(number);
current = *it;
if(direction == 1){// right
next = it;
next ++;
if(next == myset.end()){// right most
direction = 0;// change direction
distanceSum += ((maxNumber - current) * 2 + (current - last));
temp = it;
it --;
myset.erase(temp);
last = current;
}
else{
distanceSum += (current - last);
temp = it;
it ++;
myset.erase(temp);
last = current;
}
}
else if(direction == 0){// left
if(it == myset.begin()){// left most
direction = 1;// change direction
distanceSum += ((current - minNumber) * 2 + (last - current));
temp = it;
it ++;
myset.erase(temp);
last = current;
}
else{
distanceSum += (last - current);
temp = it;
it --;
myset.erase(temp);
last = current;
}
}
}
// ===============================remaining===============================
// for(int i = 0; i < queueSize; i ++){
// current = *it;
// if(direction == 1){// right
// next = it;
// next ++;
// if(next == myset.end()){
// direction = 0;
// if(myset.size() == 1)distanceSum += (current - last);
// else distanceSum += ((maxNumber - current) * 2 + (current - last));
// temp = it;
// it --;
// myset.erase(temp);
// last = current;
// }
// else{
// distanceSum += (current - last);
// temp = it;
// it ++;
// myset.erase(temp);
// last = current;
// }
// }
// else if(direction == 0){
// if(it == myset.begin()){
// direction = 1;
// if(myset.size() == 1)distanceSum += (last - current);
// else distanceSum += ((current - minNumber) * 2 + (last - current));
// temp = it;
// it ++;
// myset.erase(temp);
// last = current;
// }
// else{
// distanceSum += (last - current);
// temp = it;
// it --;
// myset.erase(temp);
// last = current;
// }
// }
// }
myfile.close();
}
else cout << "Unable to open file";
print();
cout << "distanceSum is :" << distanceSum << endl;
return 0;
}
void print(){
cout << "value:" << endl;
for(multiset<int>::iterator it = myset.begin(); it != myset.end(); it ++){
cout << *it << "\t";
}
cout << endl;
cout << "current point to:" << *it << endl;
cout << "total size is:" << myset.size() << endl;
cout << "current distance:" << distanceSum << endl;
}
和测试数据:
https://drive.google.com/file/d/0ByMlz1Uisc9ONWJIdFFXaGdpSXM/edit?usp=sharing
你应该把它保存为文件名'sort'
答案 0 :(得分:1)
我现在已经读过你的算法三次,我能找到的唯一一个错误是当你读到相同的值时。考虑一下,
您将新元素插入队列中,该队列也位于“300”位置。
Now in the multiset implementation according to this SO answer
(http://stackoverflow.com/q/2643473) depending on the implementation
the value can either go right to your present value(C++ 0x) or can go
anywhere(C++03).
因此,如果您处于第300位,并假设新值将插入多重集中当前值的右侧。
如果您在右侧并且在当前值的左侧插入相同的值,则会发生同样的错误。
以下是使用3的队列化的例子。
考虑你的multiset队列有值(300,700,900)和左边的方向= 0。右边的星号的数字表示迭代器的位置。我们假设此时totalSweepDistance = 0。
<强>解决方案强>
一种可能的解决方案是在队列中插入一个与当前值相同的新值。当您向左移动时,检查当前位置的右侧一个位置,当您向右移动以插入相同值时,检查当前位置左侧的一个位置。