- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个文件,其中有第一行,我想做扫描算法(电梯)来计算总距离。
队列大小为 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))
我做的是下面的代码,我用multi set来存储,
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'
最佳答案
我已经读了你的算法三遍了,我唯一能找到的错误是当你读到相同的值时。考虑一下,
您将新元素插入队列中,位置也是“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 的队列大小的说明。
考虑您的多集队列具有值 (300,700,900) 和方向 = 0,即左侧。右边带星号的数字表示迭代器所在的位置。让我们假设此时 totalSweepDistance=0。
解决方案
一个可能的解决方案是,当您向队列中插入一个与当前值相同的新值时。向左移动时检查当前位置右侧的一个位置,向右移动时检查当前位置左侧的一个位置以插入相同的值。
关于c++ - 磁盘调度程序 SCAN 算法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20829623/
我在服务器启动时创建一个缓存(服务器启动每次都需要10分钟)。目前我正在使用内存缓存(Ehcache)。现在我想建立一个机制,以便一旦数据被缓存我应该能够在几秒钟内启动服务器。比如将缓存的持久副本写入
我编写 json 结构的方式使得文件(在进行了一个月的测量后)存储在磁盘上时仍然只有 100 MB 左右。但是现在文件大约是 20mb,但我看到我的脚本需要的内存大约是 200/300 mb。显然,脚
Solaris9 x86下如何挂载和永久挂载windows fat32分区 临时挂载Shell 命令; mout –F pcfs /dev/dsk/c1d0p0:c /mnt/c mount
磁盘ID中的资源组名称大小写不敏感。重现此问题的步骤 - 在 Azure 中创建独立磁盘,检查 ID。对于例如 -“/subscriptions/subscriptionID/resourceGrou
我已将附加数据磁盘的备份还原到新虚拟机。当我发出命令 sudo blkid 时,我发现它与附加到原始虚拟机的数据磁盘具有相同的 UUID,因此我无需更改 fstab 即可在启动时挂载它。然而,它似乎是
在用户态中,执行磁盘 IO 就像链接 C 库一样简单,或者,如果您喜欢冒险,可以直接执行系统调用。我想知道内核本身是如何执行 IO 的。 换句话说,假设我在裸机上以特权模式运行应用程序。我将如何访问通
我已将附加数据磁盘的备份还原到新虚拟机。当我发出命令 sudo blkid 时,我发现它与附加到原始虚拟机的数据磁盘具有相同的 UUID,因此我无需更改 fstab 即可在启动时挂载它。然而,它似乎是
我正在尝试使用 laravel 和 ffmpeg 创建缩略图。但是我收到了这个错误。 磁盘 [视频] 没有配置驱动程序。 我的代码 public function index() { FFMp
我的目标是读/写 usb。 首先必须打开并读取 usb 低级别,如“程序” 我使用 visual c++ 和 winAPI 下面是我的测试代码 char path[64]; sprintf(path,
内核缓冲区缓存何时为空?这似乎不是 LINE Buffering。如果我写 () 一个没有换行符的字符串,它会立即输出到文件。 另外,socket文件的输入输出缓冲区是否也像Disk I/O一样使用内
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我有一个大型调用中心,有 250 个并发调用。队列日志的队列应用程序平面文件。该系统使用 Asterisk 和 Queuemetrics。两个服务都在同一台服务器上运行。规范为 16 核和 64 GB
我在使用安装了 Centos7 的 VMWare VM 时遇到问题。 lsblk 命令给出如下内容 df -h 给出这个 我正在尝试将 root lvm 扩展到分区,但无论我如何尝试都无法做到这一点。
在基于内存的计算模型中,通过考虑数据结构,可以抽象地完成唯一需要进行的运行时计算。 但是,关于高性能磁盘 I/O 算法的文档并不多。因此,我提出了以下一组问题: 1) 我们如何估计磁盘 I/O 操作的
我不是在寻找调用命令行实用程序的代码,它可以解决问题。我实际上很想知道用于创建 RAM 磁盘的 API。 编辑 动机:我有一个第三方库,它需要一个目录名,以便以某种方式处理该目录中的文件。我将这些文件
MySQL 数据库显示磁盘 I/O 利用率持续保持在 100% 左右。数据库服务器有 24 GB 内存。 我们尝试优化查询,但效果不佳。 请检查如下所示的当前配置参数: 参数 当前值 key_buff
这是交易。我们本可以采用完全静态 html 的方式来解决性能问题,但由于该站点将是部分动态的,因此这对我们来说行不通。我们想到的是使用 memcache + eAccelerator 来加速 PHP
对于游戏 Minecraft,运行服务器应用程序时的一般方法是在 RAMDisk 中运行它,因为它使用数百个小文件来生成世界,I/O 速度是主要瓶颈。 在最近的尝试中,我尝试使用 Dokan/ImDi
当我查找文件中的某个位置并写入少量数据(20 字节)时,幕后发生了什么? 我的理解 据我所知,可以从磁盘写入或读取的最小数据单位是一个扇区(传统上是 512 字节,但该标准现在正在改变)。这意味着要写
如何使用golang获取xen服务器的内存、磁盘、网络和cpu信息? 是否有任何可用的软件包? 最佳答案 与其他服务器有什么不同?如果没有 - 有一堆 Go 包可以做到这一点,我正在使用这个 - ht
我是一名优秀的程序员,十分优秀!