sizeof

实现malloc-free用来管理64k内存

怎甘沉沦 提交于 2020-04-07 12:21:38
问题的引入 实现malloc-free,用来管理64k的内存。这是一道面试题,也是一道很好的设计题 解决思路 1.malloc(size_t size), free(void *p)是用户api, 释放的时候需要知道释放空间的大小,并且需要放入到一个空闲链表里面去,可以这样设计 typedef struct item{ uint16_t size; union { char mem[4]; struct item *next; }mn; }__attribute__ ((packed)) item; 2.采用union,如果分配给用户,则为可以使用内存,加入到空闲链表,则为链表指针。这里的指针大小为4个字节,因此分配给用户的最小长度为4字节,如果用户申请的长度小于4个字节,应该分配4个字节。 如果为16位机器,则应该将联合体改为union {char mem[2];struct item *next;}mn; 3.为了避免内存碎片,这里需要将释放的两个相邻的区域拼接成一个较大的空间,设计一个splice函数。 4.申请,首先找到第一个比申请内存大的空间,然后划分一部分分配给用户,划分函数为cut. 实现 define ITEM_SIZE (sizeof(item) - sizeof(void *)) typedef struct item{ uint16_t size; union

NOIp 2018 前的图论板子总结

∥☆過路亽.° 提交于 2020-04-07 07:25:05
存图 存边 直接开一个结构体数组存边 struct Edge { int begin, end, weight; } edge[10010]; int edge_count; inline void AddEdge(const int &u, const int &v, const int &w) { edge[edge_count++] = Edge {u, v, w}; } 应用: Kruskal's algorithm Adjacency matrix 用二维数组 adj[i][j] 表示 \(i\) 与 \(j\) 的关系 int adj[1010][1010]; #define ADD_EDGE(u, v, w) adj[u][v] = w 应用: Floyd-Warshall algorithm Hangarian algorithm Kuhn-Munkres algorithm Adjacency list 有几种形式, 以 adj[i] 表示以 \(i\) 为开头的边 应用: 各种图论算法 vector 优点: 访问方便, 存图方便 缺点: 消耗空间, 容易 \(MLE\) ; 删边速度慢 struct Edge { int destination, weight; }; std::vector<Edge> adj[1010]; 加边 #define ADD

poj_3281Dining(网络流+拆点)

删除回忆录丶 提交于 2020-04-07 06:27:53
poj_3281Dining(网络流+拆点) 标签: 网络流 题目链接 题意: 一头牛只吃特定的几种食物和特定的几种饮料,John手里每种食物和饮料都只有一个,问最多能够满足几头牛的需求(水和食物都必须和他们的胃口)。 题解: 网络流 建图:从源点向每个食物连一条边,容量为1, 将牛拆成两个点牛,牛',中间连边,容量为1 从食物向牛连边,容量为1 连牛'和饮料,容量为1 连饮料和汇点,容量为1 网络流三种算法的理解和代码实现以及相应的模板 先介绍一个定理: 最大流最小割定理: 割:去掉某几条边使得源点和汇点不再联通,那么这几条边就叫一个割,这几条边的边权和最小的就叫做最小割。 一个图的最大流就是这个图对应的最小割,可以看做是一个沙漏,最大流是要求这个沙漏每个时刻最大的流量,那就相当于是求沙漏最细的地方的流量。而最小割就相当于是用一个刀子将这个沙漏一分为二,然后找横截切面最小的就是这个沙漏最细的地方。 再介绍一些网络流的一些基本性质 流网络G的流(flow)是一个实值函数 f :V ×V → R,且满足下列三个性质 (1) 容量限制:对于∀u,v∈V ,要求 f (u,v) ≤ c(u,v)。 (2) 反对称性:对于∀u,v∈V ,要求 f (u,v) = −f (v,u)。 (3) 流守恒性:对于∀u,v∈V −{s,t},要求∑f (u,v) =0。 f(u,v)即为u到v的流

线性代数方程组的求解

若如初见. 提交于 2020-04-06 23:51:39
#include "stdafx.h" #include <stdlib.h> #include <math.h> #include <stdio.h> #include "LinearEquation.h" #include "MatrixAlgo.h" //求解三对角线方程组的追赶法 int atrde(double b[],int n, int m, double d[]) { int k,j; double s; if(m != (3*n-2)) { printf("err\n"); return(-2); } for(k = 0;k <= n-2;k++) { j = 3*k; s = b[j]; if(fabs(s)+1.0 == 1.0) { printf("fail\n"); return(0); } b[j+1] = b[j+1]/s; d[k] = d[k]/s; b[j+3] = b[j+3]-b[j+2]*b[j+1]; d[k+1] = d[k+1]-b[j+2]*d[k]; } s = b[3*n-3]; if(fabs(s)+1.0 == 1.0) { printf("fail\n"); return(0); } d[n-1] = d[n-1]/s; for(k = n-2;k>=0;k--) d[k] = d[k]-b[3*k+1]*d[k+1];

拓展欧几里得 专题

放肆的年华 提交于 2020-04-06 11:32:23
大神orz (具体参考请点这) 我根据个人感觉弄了一下自己的思路 ZOJ 3609 : http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4712 求最小逆元,坑点就是对m=1的特判 /************************************************************** Problem:zoj 3609 User: youmi Language: C++ Result: Accepted Time:0s Memory:272kb ****************************************************************/ //#pragma comment(linker, "/STACK:1024000000,1024000000") //#include<bits/stdc++.h> #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <stack> #include <set> #include <sstream> #include <cmath> #include <queue>

SQL Server CE开发环境建立过程

做~自己de王妃 提交于 2020-04-06 03:40:53
使用EVC4创建基于对话框的工程,增加一按键并在其响应中Copy sqlce.chm中Creating Databases部分代码进行测试。记录过程如下: 1) error C2065: 'DBPROPSET' : undeclared identifier 等79个编译错误 解决方法:在StdAfx.h中增加以下几个头文件 : 1 #include <oledb.h> 2 #include <oledberr.h> 3 #include <coguid.h> 4 #include "ca_mergex20.h" 5 #include "ssceoledb.h" //DBPROPSET 注:在CSDN上有一帖子,说明除了以上内容外,还需要修改并增加以下内容: 1 修改StdAfx.h 2 //#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows 3 //上面这条一定要注释掉的,并加入以下引用 4 //////////////////////////////////////////////////////////////////////////////// 5 //以下这几句很重要,否则编译会提示你错误 6 #define DBINITCONSTANTS 7 #define INITGUID 验证结果

专题训练之拓步排序

↘锁芯ラ 提交于 2020-04-04 04:26:05
推荐几个博客:https://blog.csdn.net/dm_vincent/article/details/7714519 拓扑排序的原理及其实现 https://blog.csdn.net/u012860063/article/details/38017661 拓扑排序的几种写法 https://blog.csdn.net/shahdza/article/details/7779389 拓扑排序题集 1.基于DFS的拓扑排序:一般适用于数据较小并且需要判断有无环的情况 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=150; 6 int n,vis[maxn],topo[maxn],cnt; 7 bool g[maxn][maxn],flag; 8 9 void dfs(int u) 10 { 11 if ( vis[u]<0 ) { 12 flag=false; 13 return; 14 } 15 if ( vis[u]>0 ) return; 16 else vis[u]=-1; //表示当前还在访问中 17 for ( int v=1;flag&&v<=n;v++ ) { 18 if ( g[u][v] ) dfs

强连通专题

删除回忆录丶 提交于 2020-04-04 04:23:57
求割点(无向边): 所谓的割点,就是删除某个点,图便不连通了。 POJ 1523 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int MN=1111; struct Edge { int to,next; }edge[MN<<2]; int dfn[MN]; int low[MN]; int head[MN<<2]; int subnet[MN]; int E,tp,root; int vis[MN]; void Init() { memset(dfn,-1,sizeof(dfn)); memset(low,0,sizeof(low)); memset(head,-1,sizeof(head)); memset(subnet,0,sizeof(subnet)); memset(vis,0,sizeof(vis)); E=tp=0; } void Add(int a,int b) { edge[E].to=b; edge[E].next=head[a]; head[a]=E++; } void tarjan(int u,int fa) { int son=0; vis[u]=1; dfn[u]=low[u]=++tp; for(int i=head[u];i!=

专题训练之强连通分量

北城余情 提交于 2020-04-04 04:23:18
tarjan模板 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=20010; 6 const int maxm=50010; 7 struct edge{ 8 int to,nxt; 9 }edge[maxm]; 10 int head[maxn],tot; 11 int low[maxn],dfn[maxn],stack[maxn],belong[maxn]; 12 int index,top; 13 int scc; 14 bool vis[maxn]; 15 int num[maxn]; 16 17 void addedge(int u,int v) 18 { 19 edge[tot].to=v; 20 edge[tot].nxt=head[u]; 21 head[u]=tot++; 22 } 23 24 void tarjan(int u) 25 { 26 int v; 27 low[u]=dfn[u]=++index; 28 stack[top++]=u; 29 vis[u]=true; 30 for ( int i=head[u];i!=-1;i=edge[i].nxt ) { 31 v=edge[i].to; 32

CreateDIBSection函数

瘦欲@ 提交于 2020-04-04 04:22:48
HBITMAP CreateDIBSection( HDC hdc, // handle to DC CONST BITMAPINFO*pbmi, // bitmap data UINT iUsage, // data type indicator VOID**ppvBits, // bit values HANDLE hSection, // handle to file mapping object DWORD dwOffset // offset to bitmap bit values); CreateDIBSection函数会根据位图结构信息(pbmi)分配内存空间,你不用为它分配内存,这块内存也不需要你释放,系统会自己释放的。然后将位图中的图像数据读入这个内存地址,显示即可。 LPBYTE lpBits; HBITMAP hBmp=::CreateDIBSection(dcMem.m_hDC,lpBitmap,DIB_PAL_COLORS, &lpBits,NULL,0); //将图像数据填充到得到的内存地址中 file.ReadHuge(lpBits,dwBitlen); pDC->StretchBlt(0,0,bmp.bmWidth,bmp.bmHeight,&dcMem,0,0, bmp.bmWidth,bmp.bmHeight,SRCCOPY);