百度面试题?

Lactoferrin 2012-04-25 11:30:51
网上看到的

假设存在一个超大数组,数组分配出来未初始化,现在不希望对数组进行初始化,但需要在访问数组某个元素的时候知道这个位置上的数是否是第一次被访问.判断过程需要是O(1)复杂度.如果存在预处理,预处理也应该是O(1)复杂度.可以假设存在无穷大的空间.
...全文
6072 94 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
94 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我的回复呢?
  • 打赏
  • 举报
回复
原来是这样啊:

一个数组的一个元素值只有一个下标,现在把元素值作为value,元素下标作为key。 key和value一一映射。

存取的时候,映射关系建立表明数据被访问过。

因为kv的一一对应关系,把数据的相等关系转化为了线性存取问题。

空间换时间啊,牛啊亲~
zdaqian 2012-05-01
  • 打赏
  • 举报
回复
Bitmap?
darkread 2012-04-30
  • 打赏
  • 举报
回复
访问时标记
分治思想进行分组
对分组HASH
分组内在HASH
么了
pupingpp 2012-04-29
  • 打赏
  • 举报
回复
学习了,刚再看《编程珠玑》这本书,好强大啊!但是精髓还未掌握啊,还不会灵活贯通,活学活用,现在通过实例学习了!!
  • 打赏
  • 举报
回复
谢谢movieqiu,我也懂了。编程珠玑我也看过,但是都不记得了。
  • 打赏
  • 举报
回复
记录访问过的地址可以么?
tzxx 2012-04-28
  • 打赏
  • 举报
回复
编程珠玑第二版,第一章,第9题?
dickbarry 2012-04-28
  • 打赏
  • 举报
回复
如果是windows平台
考虑结构化异常处理+virtualalloc预定内存
第一次访问,如果没有分配内存,在异常中调拨;如果没有触发异常,则说明已经访问过
movieqiu 2012-04-28
  • 打赏
  • 举报
回复
[Quote=引用 82 楼 的回复:]

movieqiu 你 from to 都没有初始化。
[/Quote]

初始化就达不到题目的条件了。
并且也不需要初始化的,你在纸上比划比划就能明白这个过程。
movieqiu 2012-04-28
  • 打赏
  • 举报
回复
[Quote=引用 80 楼 的回复:]

movieqiu你在哪个书看的,programming pearls还是你说的那个
[/Quote]

编程珠玑,呵呵,引用的那本书只是感慨一下,人家在pc尚未普及之时已经把路都快铺完了。
changyanchen 2012-04-28
  • 打赏
  • 举报
回复
movieqiu 你 from to 都没有初始化。
Lactoferrin 2012-04-28
  • 打赏
  • 举报
回复
to的尺寸和那个数组一样,from尺寸是那个数组元素能取的不同值的个数
Lactoferrin 2012-04-28
  • 打赏
  • 举报
回复
movieqiu你在哪个书看的,programming pearls还是你说的那个
Lactoferrin 2012-04-28
  • 打赏
  • 举报
回复
看懂了,from和to的大小无限,不用初始化
用数学归纳法证明一下
基类显然,就不谈
假设存取了n个不同的索引,a0,a1,..,an-1,能够正确判断
则top=n
from[a0]=0,from[a1]=1,..,from[an-1]=n-1
to[0]=a0,to[1]=a1,...,to[n-1]=an-1
现在存取an,如果an和a0,...,an-1某一个相等,比如ai,i<n,则from[an]=i<top,可判断存取过
如果an和这些都不同,则有两种情况,top>from[an]或top<=from[an]
如果top<=from[an]则没存取过,正确判断
如果top>from[an],则from[an]<n,而to的前n个元素是a0..an-1,和an不同,所以if(false),正确判断
changyanchen 2012-04-28
  • 打赏
  • 举报
回复
我还高兴的以为真的有高人解了呢,上午开始就关注这个问题了。
artwalkx 2012-04-28
  • 打赏
  • 举报
回复
所以在堆上开辟啊,这样就不用初始化了
但这样下面这个报错,from[i]是个未知数,所以to[ from[i] ]会访问错误
MAX限制嘛,要是内存无限,应该就搞定了


#include <STDIO.H>

#define type int
#define MAX 1024

int main(int argc, char **argv)
{
type arr[MAX];
int i;
for ( i=0;i<MAX;++i ) {
arr[i] = i;
}

type* from = new type[MAX];
type* to = new type[MAX];
/*
static type from[MAX];
static type to[MAX];
*/
int top=0;
while ( scanf("%d", &i) ) {
printf("arr[%d] = %d\n", i, arr[i]);

if ( top>from[i] && to[ from[i] ]==i ) {
printf("访问过\n");
} else {
from[i] = top;
// printf("from[%d] = %d\n", i, from[i]);
to[from[i]] = i;
// printf("to[%d] = %d\n", i, to[from[i]]);
++top;
}
}

return 0;
}
Lactoferrin 2012-04-28
  • 打赏
  • 举报
回复
什么叫理论上不用初始化,没初始化的肯定不能用
memset是Theta(n)
定义成静态数组只是把运行时的耗费转移到了装载阶段
artwalkx 2012-04-28
  • 打赏
  • 举报
回复
理论上不用初始化
但我刚刚用c语言试了试,在栈上分配数组,不初始化,内存不能read
memset算哪个复杂度?
或者在预处理定义成静态数组呢?
[Quote=引用 74 楼 的回复:]

这两个数组不用初始化?如果要,时间就属于Omega(N)
[/Quote]
Lactoferrin 2012-04-28
  • 打赏
  • 举报
回复
这两个数组不用初始化?如果要,时间就属于Omega(N)
加载更多回复(66)

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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