priority_queue 能存 1e8 个数据吗
时间: 2024-02-21 08:55:32 浏览: 77
priority_queue 是一个优先队列容器,它可以存储一定数量的数据,并按照优先级进行排序。在 C++ 中,priority_queue 的底层实现通常是使用堆来实现的,默认情况下是一个最大堆。
对于能否存储 1e8(即 100000000)个数据,取决于你的计算机的内存大小和数据类型的大小。如果每个数据的大小较小,且你的计算机具有足够的内存,那么 priority_queue 是可以存储 1e8 个数据的。
需要注意的是,存储大量数据可能会占用大量内存,并且在插入和删除元素时可能会有一定的时间开销。因此,在使用 priority_queue 存储大量数据时,需要考虑计算机的内存限制和性能需求。
相关问题
本实验是模拟虚拟存储管理方式中的请求分页式技术中的页面置换算法,对于当前访问的页面号如果有对应的内存物理块号则直接访问(必要时可调整物理块中的页面序号),否则先输出缺页访问标志+,然后再判断物理块是否已存满,未满则直接换入当前页,若已满,则先将内存物理块中块首页面号淘汰且换出,然后再将当前页换入。 FIFO是选择在内存驻留时间最长的页面进行置换,LFU是选择最长时间没有被引用的页面进行置换。 核心数据结构 const int N = 1e3 + 10; struct Y { int cnt, val; friend bool operator<(Y a, Y b) //cnt为优先级 val为页面 cnt越大,优先级越高,越优先出队 { return a.cnt < b.cnt; } }; priority_queue< Y, vector<Y> > q; string s; //作业名 int n, m, ss[N], vis[N], ans[N][N], u[N]; //n为物理块的块数 //m为作业长度 //vis数组用于记录本次是否产生缺页面 //二维数组ans用于记录调度过程中的页面置换情况 //ss[N] 记录需要调度的页面顺序 vector<int> v; //用于存放物理块序列
好的,那么你需要实现的是一个页面置换算法,可以选择FIFO或者LFU。当一个页面需要被置换时,你需要输出缺页访问标志+,然后再进行页面置换。你可以使用一个priority_queue来维护页面的优先级,其中cnt表示页面最近的访问时间或者访问次数,val表示页面号。你可以使用vis数组来记录本次操作是否造成了缺页。最后,你需要将调度过程中的页面置换情况记录在ans数组中。
你可以参考下面的代码框架进行实现:
```cpp
const int N = 1e3 + 10;
struct Y {
int cnt, val;
friend bool operator<(Y a, Y b) {
return a.cnt < b.cnt;
}
};
priority_queue<Y, vector<Y>> q;
string s; // 作业名
int n, m, ss[N], vis[N], ans[N][N], u[N];
// n为物理块的块数
// m为作业长度
// vis数组用于记录本次是否产生缺页面
// 二维数组ans用于记录调度过程中的页面置换情况
// ss[N] 记录需要调度的页面顺序
vector<int> v; // 用于存放物理块序列
void FIFO() {
// TODO: 实现FIFO页面置换算法
}
void LFU() {
// TODO: 实现LFU页面置换算法
}
int main() {
cin >> s >> n >> m;
for (int i = 1; i <= m; i++) {
cin >> ss[i];
v.push_back(ss[i]);
}
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
// 初始化物理块序列
for (int i = 0; i < n; i++) {
u[i] = v[i];
q.push({0, v[i]});
}
// 调用FIFO或者LFU进行页面置换
// 输出缺页访问标志+以及页面置换情况
return 0;
}
```
#include <iostream>#include <cstring>#include <queue>#define N 2005#define INF 1e18using namespace std;typedef long long ll;typedef pair<ll, int> P;int n, m, s, t;bool vis[N];ll dist[N];vector<P> G[N];void dijkstra(int s) { priority_queue<P, vector<P>, greater<P> > que; memset(vis, false, sizeof(vis)); fill(dist, dist + N, INF); dist[s] = 0; que.push(P(0, s)); while(!que.empty()) { P p = que.top(); que.pop(); int v = p.second; if(vis[v]) continue; vis[v] = true; for(int i = 0; i < G[v].size(); i++) { int u = G[v][i].second; ll d = G[v][i].first; if(dist[u] > dist[v] + d) { dist[u] = dist[v] + d; que.push(P(dist[u], u)); } } }}int main() { cin >> n >> m >> s >> t; for(int i = 0; i < m; i++) { int a, b; ll c; cin >> a >> b >> c; G[a].push_back(P(c, b)); G[b].push_back(P(c, a)); } dijkstra(s); cout << dist[t] << endl; return 0;}不使用queue的STL实现这个代码
以下是不使用 STL 的 queue 实现的代码,使用手写堆来代替 queue,原理是相同的:
```cpp
#include <iostream>
#include <cstring>
#define N 2005
#define INF 1e18
using namespace std;
typedef long long ll;
typedef pair<ll, int> P;
int n, m, s, t;
bool vis[N];
ll dist[N];
P heap[N];
int heap_size = 0;
int idx[N];
void push(P x) {
int i = ++heap_size;
while(i != 1 && heap[i / 2].first > x.first) {
heap[i] = heap[i / 2];
idx[heap[i].second] = i;
i /= 2;
}
heap[i] = x;
idx[x.second] = i;
}
void pop() {
P x = heap[heap_size--];
int i = 1, j = 2;
while(j <= heap_size) {
if(j < heap_size && heap[j].first > heap[j + 1].first) j++;
if(heap[j].first >= x.first) break;
heap[i] = heap[j];
idx[heap[i].second] = i;
i = j; j *= 2;
}
heap[i] = x;
idx[x.second] = i;
}
void up(P x) {
int i = idx[x.second];
while(i != 1 && heap[i / 2].first > x.first) {
heap[i] = heap[i / 2];
idx[heap[i].second] = i;
i /= 2;
}
heap[i] = x;
idx[x.second] = i;
}
void dijkstra(int s) {
memset(vis, false, sizeof(vis));
fill(dist, dist + N, INF);
dist[s] = 0; push(P(0, s));
while(heap_size > 0) {
P p = heap[1]; pop();
int v = p.second;
if(vis[v]) continue;
vis[v] = true;
for(int i = 0; i < G[v].size(); i++) {
int u = G[v][i].second;
ll d = G[v][i].first;
if(dist[u] > dist[v] + d) {
dist[u] = dist[v] + d;
if(idx[u] == 0) push(P(dist[u], u));
else up(P(dist[u], u));
}
}
}
}
int main() {
cin >> n >> m >> s >> t;
for(int i = 0; i < m; i++) {
int a, b; ll c;
cin >> a >> b >> c;
G[a].push_back(P(c, b));
G[b].push_back(P(c, a));
}
dijkstra(s);
cout << dist[t] << endl;
return 0;
}
```
这个代码相比前面的代码更加底层,可读性稍差,但是也实现了相同的算法。
阅读全文
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)