2011-08-21 3 views
0

프랑스어 단어가 들어 있고 반복하지 않고 표시하려는 db가 있습니다. 나는 1.000.000.xxx 단어를 가지고 있다면 이것이 어렵고 최적화되지 않을 것이라고 생각하기 때문에 모든 것을 가져오고 배열에 넣고 싶지 않습니다. 하나를 고르고 싶습니다. 다른 것을 고르고 싶을 때, 이전에 선택한 단어는 결과에 나타나지 않습니다.검색 할 대기열 알고리즘이 표시되지 않습니다.

여기에 적합한 알고리즘이 있습니까?

추신 : 코드가 MsSQL에 적합한 경우 C#이 더 좋을 것입니다.

편집 : 빈도에 따라 새로운 임의의 단어를 표시하고 싶습니다. 예를 들어, 테이블에 4 단어가 있고 사용자가 더 자주 단어 2와 4를 보길 원합니다. 그러나 첫 번째 단어는 알려지기를 원하지 않습니다. 두 번째와 네 번째로 더 자주 표시하고 싶습니다. 그러나 모든 글에서 같은 단어에 대해 반복적으로 나타나고 싶지 않다.

+0

어떤 데이터베이스 엔진을 사용합니까? –

+0

어떤 데이터베이스를 사용하고 있습니까? db에 대한 지식이있는 SQL 솔루션이 가능할 수도 있습니다. –

+0

각 사용자마다 별도로 필요합니까? – svick

답변

0

당신이 order by newid()를 사용하여 임의의 단어를 얻을 수 있습니다. 모든 단어가보다 빈번한 높은 값이 적어도 1 단어가 여기서

select top 1 Word 
from Words 
order by newid() 

주파수 열은 int이다. order by newid()을 사용하려면 더 높은 freq 값을 가진 단어에 대한 중복을 포함하는 테이블을 만들어야합니다. 그것은 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() 

1.000.000 단어의 1.2GHz 프로세서가 장착 된 정말 슬픈 노트북에서는 9 초가 걸립니다.

주파수 열 대신에 이미 중복 된 단어가있는 테이블이 있었기 때문에 집계 테이블을 건너 뛸 수 있으므로 한 단어를 선택하는 데 2 ​​초가 걸렸습니다.

1

한 단어를 골라 내고 싶다면이 단어가 반복되면 discardit. 권리?

이 시도 :

오라클에서
pick a word 
search in a Map 
if the word is in the Map 
    repited word 
else 
    new word, insert in Map 
1

당신이 ROWNUM을 사용하여이 작업을 수행 할 수 있습니다 :

SELECT DISTINCT WORD FROM WORDS 
LIMIT :NUMBER_OF_WORDS OFFSET :START_INDEX 
1

당신이 경우 : 당신이 LIMIT 기능을 사용할 수 있습니다 MySQL의에서

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

MS SQL을 사용하여 시험해보십시오. RowNumber()

C# 응용 프로그램을 개발하는 경우에는 .NET Framework에서 지원되는 컨트롤을 사용하여 SQLDataAdapterDataSet을 시험해보십시오. 각 행

create table Words 
(
    Word varchar(25) primary key, 
    Freq int not null 
) 

에 대한 단어 한 단어와 같은 테이블 Words

+0

RowNumber ok하지만 Row_Number() 함수에서 생성 된 열은 어떻게 처리합니까? – uzay95

+0

그 주제를 처음 읽었을 때, 페이징 (**, .NET FrameworkWork **에서 작동하는 몇 가지 컨트롤 지원을 삽입 한 후)에 대해 이야기했다고 가정했습니다. 그것이 당신이 찾고있는 것이라면 ** RowNumber() **로 쉽게 검색 할 수 있습니다. – BachT

관련 문제