二维数组中查找某个值的实现思路

FightForProgrammer 2015-11-13 04:14:19
给定一个二维数组int t[m][n],其中m和n千万级别,且t中没有任何的规律(如有序等)。有什么好的办法,在不用多线程等技术的前提下高效的实现?
...全文
455 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2015-11-13
  • 打赏
  • 举报
回复
引用 8 楼 FightForProgrammer 的回复:
[quote=引用 7 楼 paschen 的回复:] int t[m][n]可以有那么大??m和n都千万级别,不说栈暴了,堆都暴了 如果要想查找快,你放数据就应该用关联式容器(如哈希表等储存),否则你查找时只能逐个遍历
确实没那么大,也不是数组,一共2g左右把。就用内存映射咯?[/quote] 2G 是2*1000 000 000 int[m][n]是 4 *千万*千万 或者 8 *千万*千万*是 千万*千万 = 1000 *1000 * 1000 * 1000* 100 = 100T;共400T或者800T 和2G不是一个数量级的。 一个磁盘也就1T,2T,市面上最大的也就4T 你可能需要B+树这一类的数据结构.噢,估计还是不行 你还是用数据库,放服务器上吧
FightForProgrammer 2015-11-13
  • 打赏
  • 举报
回复
引用 7 楼 paschen 的回复:
int t[m][n]可以有那么大??m和n都千万级别,不说栈暴了,堆都暴了 如果要想查找快,你放数据就应该用关联式容器(如哈希表等储存),否则你查找时只能逐个遍历
确实没那么大,也不是数组,一共2g左右把。就用内存映射咯?
paschen 2015-11-13
  • 打赏
  • 举报
回复
int t[m][n]可以有那么大??m和n都千万级别,不说栈暴了,堆都暴了 如果要想查找快,你放数据就应该用关联式容器(如哈希表等储存),否则你查找时只能逐个遍历
FightForProgrammer 2015-11-13
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
[quote=引用 4 楼 FightForProgrammer 的回复:] [quote=引用 3 楼 zhao4zhong1 的回复:] [quote=引用 1 楼 lm_whales 的回复:] 用文件当数组使用吧
英雄所见略同![/quote] 多谢,能指点一下大概的实现框架吗?[/quote]
// 创建文件句柄
HANDLE hFile = ::CreateFile(lpszFileName, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
// 创建文件映射
HANDLE hMap = ::CreateFileMapping(hFile, NULL, PAGE_READONLY | SEC_COMMIT, NULL, NULL, NULL);
// 读取映射中的内存
LPVOID lpBuffer = ::MapViewOfFile(hMap, FILE_MAP_READ, NULL, NULL, NULL);

// 好了文件的内存已经获取了,你可以随意处理了

// 释放映射内存
::UnmapViewOfFile(lpBuffer);
// 关闭文件映射
::CloseHandle(hMap);
// close file handle
::CloseHandle(hFile);
Linux下参考 void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset); [/quote] 嗯。这是把数据准备好把。其实想问的是如何组织数据,高效查询,难道只有逐个遍历这一条路吗?
赵4老师 2015-11-13
  • 打赏
  • 举报
回复
引用 4 楼 FightForProgrammer 的回复:
[quote=引用 3 楼 zhao4zhong1 的回复:] [quote=引用 1 楼 lm_whales 的回复:] 用文件当数组使用吧
英雄所见略同![/quote] 多谢,能指点一下大概的实现框架吗?[/quote]
// 创建文件句柄
HANDLE hFile = ::CreateFile(lpszFileName, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
// 创建文件映射
HANDLE hMap = ::CreateFileMapping(hFile, NULL, PAGE_READONLY | SEC_COMMIT, NULL, NULL, NULL);
// 读取映射中的内存
LPVOID lpBuffer = ::MapViewOfFile(hMap, FILE_MAP_READ, NULL, NULL, NULL);

// 好了文件的内存已经获取了,你可以随意处理了

// 释放映射内存
::UnmapViewOfFile(lpBuffer);
// 关闭文件映射
::CloseHandle(hMap);
// close file handle
::CloseHandle(hFile);
Linux下参考 void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);
FightForProgrammer 2015-11-13
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
[quote=引用 1 楼 lm_whales 的回复:] 用文件当数组使用吧
英雄所见略同![/quote] 多谢,能指点一下大概的实现框架吗?
赵4老师 2015-11-13
  • 打赏
  • 举报
回复
引用 1 楼 lm_whales 的回复:
用文件当数组使用吧
英雄所见略同!
假正经的班长 2015-11-13
  • 打赏
  • 举报
回复
没有规律,你还是要遍历一遍的。
lm_whales 2015-11-13
  • 打赏
  • 举报
回复
用文件当数组使用吧

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧