社区
数据结构与算法
帖子详情
公司面试题100分求解!!
mostneed
2002-09-17 12:37:39
随机产生10万个数,要求维一,然后写到数据库中。用什么算法?
我的想法是先随机产生数,然后用快速查找算法在数据库中查找直到没有相同的,然后写入数据库中。
不知道行不行,希望大家给个最快的算法。
谢谢!!
...全文
79
16
打赏
收藏
公司面试题100分求解!!
随机产生10万个数,要求维一,然后写到数据库中。用什么算法? 我的想法是先随机产生数,然后用快速查找算法在数据库中查找直到没有相同的,然后写入数据库中。 不知道行不行,希望大家给个最快的算法。 谢谢!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
谢谢!! 还有什么算法吗?
100
道SQL
面试题
文章讲述了作者李岳关于SQL编程能力在招聘中的重要性,并
分
享了他的SQL学习资源《SQL145题》和《SQL
100
题》。这些题目旨在帮助求职者和开发者提升SQL技能,包括基础和进阶内容,以及提供解答和学习社群支持。,
整理了
100
道SQL
面试题
,欢迎订阅
文章讲述了作者李岳关于SQL编程能力在招聘中的重要性,并
分
享了他的SQL学习资源《SQL145题》和《SQL
100
题》。他提供了不同版本的题库,旨在帮助开发者提升SQL技能,特别适合有一定经验但需巩固基础或探索新题型的人群。
各大
公司
面试题
总结
本文精选了多家知名互联网
公司
的Android
面试题
,涵盖了Android基础知识、数据结构与算法、网络通信等多个方面,旨在帮助求职者全面准备面试。
微软
公司
面试题
【1】
本文介绍了一个用于计算指定范围内所有质数之和的算法,适合初学者学习。通过定义质数
求解
函数、求和函数和输出格式化函数,实现了一套完整的流程来解决该问题。
谷歌
面试题
-
100
层楼两个棋子的问题
解析谷歌
公司
的
面试题
目,如何使用两个玻璃围棋子找到
100
层大厦的临界层,给出最优策略,并拓展到m层楼高,k个球的情况。
数据结构与算法
33,025
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章