我有一个数据库,其中包含法语单词,并希望显示他们没有重复。我不想检索所有它们并放入一个数组中,因为我认为如果我有1.000.000.xxx个单词,这将是困难的,也不是最优的。我想选择一个单词,当我想选择另一个单词时,以前选择的单词将不会出现在结果中。
有没有适合这方面的算法?
PS:如果代码适用于MsSQL,C#会更好。
编辑:我想要显示新的和随机的词根据他们的频率。例如:表中有4个单词,用户希望看到更频繁的单词,2和4。但是第一个单词是已知的,但不想看到它。我想更频繁地显示第二个和第四个单词,但在每个显示的单词中都显示更少的3rd.But我不想重复显示同一个单词
发布于 2011-08-21 22:06:49
使用这样的表Words,每行有一个单词
create table Words
(
Word varchar(25) primary key,
Freq int not null
)您可以使用order by newid()获得一个随机单词。
select top 1 Word
from Words
order by newid()频率列是一个int,其中每个单词的值至少为1,频率越高的单词的值越高。要使用order by newid(),我们必须创建一个表,其中包含具有较高频率值的单词的重复项。这可以使用tally table来完成。
为了记录你已经选择的单词,你可以使用另一个表格。
create table PickedWords
(
Word varchar(25) primary key
)这是用于将所选单词添加到表PickedWords并使用output子句将该单词返回给客户端的语句。
insert into PickedWords
output inserted.Word
select top 1 W.Word
from Words as W
inner join tsqlc_Tally as T
on W.Freq > T.N
where W.Word not in (select Word
from PickedWords)
order by newid()在一台真正糟糕的笔记本电脑上只需要9秒,处理器为1.2 GHz,字数为1.000.000。
如果您有一个表,其中的单词已经重复,而不是频率列,这样我们就可以跳过计数表,选择一个单词需要2秒。
发布于 2011-08-21 20:34:04
您希望选择一个单词,如果此单词重复,则丢弃pick。对吗?
试试这个:
pick a word
search in a Map
if the word is in the Map
repited word
else
new word, insert in Map发布于 2011-08-21 20:37:12
在Oracle中,您可以使用ROWNUM执行此操作:
SELECT WORD FROM (SELECT DISTINCT WORD FROM WORDS)
WHERE ROWNUM >= :START_INDEX AND ROWNUM <= :END_INDEX在MySQL中,您可以使用限制功能:
SELECT DISTINCT WORD FROM WORDS
LIMIT :NUMBER_OF_WORDS OFFSET :START_INDEXhttps://stackoverflow.com/questions/7138233
复制相似问题