Алгоритм очереди для извлечения не показан - PullRequest
0 голосов
/ 21 августа 2011

У меня есть БД, которая содержит французские слова и хочу показать их без повторений. Я не хочу извлекать их все и помещать в массив, потому что я думаю, что это будет сложно и не оптимизировать, если у меня будет 1.000.000.xxx слов. Я хочу выбрать одно, и когда я хочу выбрать другое, предыдущие выбранные слова не будут в результате.

Есть какой-нибудь алгоритм, который подходит для этого?

PS: если коды будут подходить для MsSQL, C # будет лучше.

Редактировать: я хочу показать новые и случайные слова в соответствии с их частотой. Например: в таблице 4 слова, и пользователь хочет видеть чаще слова 2 и 4. Но 1-е слово известно и не хочет его видеть. Я хочу чаще показывать 2-е и 4-е, но реже .Но в каждом показе я не хочу, чтобы повторение показывалось для одного и того же слова

Ответы [ 4 ]

1 голос
/ 21 августа 2011

В Oracle вы можете сделать это, используя ROWNUM:

SELECT WORD FROM (SELECT DISTINCT WORD FROM WORDS)
WHERE ROWNUM >= :START_INDEX AND ROWNUM <= :END_INDEX

В MySQL вы можете использовать функцию LIMIT:

SELECT DISTINCT WORD FROM WORDS
LIMIT :NUMBER_OF_WORDS OFFSET :START_INDEX
1 голос
/ 21 августа 2011

Если вы используете MS SQL, попробуйте RowNumber ()

Если вы разрабатываете приложение на C #, попробуйте SQLDataAdapter и DataSet с поддерживаемым управлением в .NET Framework .

1 голос
/ 21 августа 2011

Вы хотите выбрать одно слово и, если это слово повторяется, отбросить. Правильно?

Попробуйте это:

pick a word
search in a Map
if the word is in the Map
  repited word
else
  new word, insert in Map
0 голосов
/ 21 августа 2011

С таблицей 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(), мы должны создать таблицу, которая содержит дубликаты для слов, которые имеют более высокое значение freq.Это можно сделать с помощью таблицы подсчета .

Чтобы отслеживать слова, которые вы уже выбрали, у вас может быть другая таблица.

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()

На действительно печальном ноутбуке с процессором с частотой 1,2 ГГц за 1000 раз требуется 9 секунд.000 слов.

Если вместо столбца частоты вместо вас есть таблица с уже дублированными словами, поэтому мы можем пропустить таблицу подсчета, то для выбора одного слова потребуется 2 секунды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...