公司面试题100分求解!!

mostneed 2002-09-17 12:37:39
随机产生10万个数,要求维一,然后写到数据库中。用什么算法?
我的想法是先随机产生数,然后用快速查找算法在数据库中查找直到没有相同的,然后写入数据库中。
不知道行不行,希望大家给个最快的算法。
谢谢!!
...全文
42 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
孩皮妞野 2002-09-19
  • 打赏
  • 举报
回复
其实主要的时间就是花在写入数据库了。

除非数据库系统提供了特别的编程接口,你只好用SQL, 一次插入一个了。

从本质上讲你的问题就是从一个不重复的集合里抽取指定模的一个子集,saint的方法算是标准解法吧。
leojay 2002-09-19
  • 打赏
  • 举报
回复
A(1)=rnd*10 ;
A(n) = A(n-1) + rnd*10 + 1 ;
这样就一定不会重了。

最多再保存起来,打乱一下就好了。
saint001 2002-09-18
  • 打赏
  • 举报
回复
上概率是设计的从数组中顺序随机抽取若干个元素的算法

数组为A[1..N],N很大,抽取得的生成成的数组为X[M]

从1..N 中随机抽取数字i,得到随机数A[i],存入X[1],同时置换A[i]和A[N];
从1..N-1中随机抽取数字i,得到随机数A[i],存入X[2],同时置换A[i]和A[N-1];
从1..N-2中随机抽取数字i,得到随机数A[i],存入X[3],同时置换A[i]和A[N-2];
以此类推,直到生成M各随机数为止

非常容易实现,时间复杂度为O(M)
不过对于本题,空间复杂度为O(N),稍多些
令M=10E5,N=10E6,A[i]=i
school 2002-09-18
  • 打赏
  • 举报
回复
边产生随机数边排序插入,相同则不插入。
孩皮妞野 2002-09-18
  • 打赏
  • 举报
回复
你往下看啊! 我提供的另一个思路呢?

顺便说一下,即使是这两个也是不同的。你的i肯定是顺序,而我的i是乱序的。比如,如果数据表是这样的结构:
ID RAND_NUM


好了,这是我对第二个思路的实现:
#include <bitset>
#include <vector>

#include <algorithm>


void genenerate(std::vector<unsigned>& vu)
{
using namespace std;
bitset<10000000> bs;

while(bs.count()<100000)
bs[random(10000000)] = true;

vu.resize(100000);
for(unsigned i=0, j=0; i<bs.size() && j<100000 ; i++)
if(bs[i])
vu[j++]=i;
random_shuffle(vu.begin(),vu.end());


}



mostneed 2002-09-18
  • 打赏
  • 举报
回复
谢谢大家!
然后写入数据库呢?不回依次写如吧。有什么快的办法?
smokyrain 2002-09-17
  • 打赏
  • 举报
回复
如果是从实用角度看,根本不用找算法,如果对数字没有格式要求,直接设置此字段类型identity并且设为键值即可。

如果说算法的话,建议实用Hash散列将每次生成的数字扩散开,或是使用分段生成的方法生成。查找数据库的方法实在不可取,代价太大。
zhf0021 2002-09-17
  • 打赏
  • 举报
回复
up
bjay 2002-09-17
  • 打赏
  • 举报
回复
to: ALNG(?)
是不是我看错了,还是的确不明白?

10万个不同的数,你让它在10万个数中“随机”生成,和
for (i =0; i<100000; i++)
Insert into ... //这是一句SQL语句,
有什么不同?
djniulihao 2002-09-17
  • 打赏
  • 举报
回复
我同意ALNG(?)的算法
孩皮妞野 2002-09-17
  • 打赏
  • 举报
回复
复杂度O(N)。


如果要求数据有随机性,即排序后不一定是连续的数,可以用set, 或bitset, 先在bit_set装入100000个数[保证不同],然后放入一个vector中random_shuffle即可。



孩皮妞野 2002-09-17
  • 打赏
  • 举报
回复
#include <vector>
#include <algorithm>

void generate(std::vector<int>& container)
{
container.resize(100000);
for(unsigned i=0; i<100000; i++)
container[i]=i;
std::random_shuffle(container.begin(),container.end());
}

搞定
DaNiao 2002-09-17
  • 打赏
  • 举报
回复
那就换一家公司吧
mostneed 2002-09-17
  • 打赏
  • 举报
回复
可是别人不允许用数据库的功能,一定要用算法. :-<
newly_ignorant 2002-09-17
  • 打赏
  • 举报
回复
查找显然太慢了,利用数据库自身的功能

create 临时表(有唯一性约束的)
i=0
while i<1000
取一个随即数
插入到临时表
if 成功 then i=i+1
wend

临时表数据导入到数据库中
删除临时表
mostneed 2002-09-17
  • 打赏
  • 举报
回复
谢谢!! 还有什么算法吗?

33,027

社区成员

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

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