2014-09-14 2 views
3

Это во многом концептуальный вопрос, поэтому у меня нет кода для показа. Я постараюсь объяснить это как можно лучше. Я пишу программу, которая должна найти общие последовательности чисел, найденных в большой таблице случайных комбинаций.Каков наиболее эффективный способ сравнения строк в таблице MySQL с Java

Так, например, взять эти данные:

1 5 3 9 6 3 8 8 3 3 

6 7 5 5 5 4 9 2 0 1 

6 4 4 3 7 8 3 9 5 6 

2 4 2 4 5 5 3 4 7 7 

1 5 6 3 4 9 9 3 3 2 

0 2 7 9 4 5 3 9 8 3 

Эти случайные combinatinos чисел 1-9. Для каждой трехзначной (или более) последовательности, найденной более одного раза, мне нужно поместить ее в другую базу данных. Итак, первая строка содержит «5 3 9», а 6-я строка также содержит «5 3 9». Я бы поместил эту последовательность в отдельную таблицу с количеством раз, когда она была найдена.

Я все еще разрабатываю алгоритм для фактического выполнения этих сравнений, но я думаю, что мне нужно будет начать с «1 5 3», сравните это с каждым трёхтомным трио, а затем перейдите к «5 3 9 ", затем" 3 9 6 "и т. Д.

МОЯ ОСНОВНАЯ ПРОБЛЕМА RIGHT NOW - это то, что я не знаю, как это сделать, если эти числа хранятся в базе данных. В моей таблице базы данных есть 11 столбцов. Один столбец для каждого отдельного номера и один столбец для 10-значной последовательности в целом. Столбцы называются Sequence, 1stNum, 2ndNum, 3rdNum ... 10thNum.

Визуальные: первая строка в моей базе данных для данных выше будет это:

| 1 5 3 9 6 3 8 8 3 3 | 1 | 5 | 3 | 9 | 6 | 3 | 8 | 8 | 3 | 3 | 

(«|» разделяй столбцы)

Как сделать сравнение эффективно с Java? Я повторяю каждую строку в таблице много раз. Однажды для начальной последовательности, которую нужно сравнить, и для каждой из этих последовательностей я просматриваю каждую строку. В основном цикл for в цикле for. Это похоже на то, что он собирается взять тонну запросов и может занять вечность, если таблица станет массивной (что будет).

Является ли это более эффективным с точки зрения вычислений, если я итерации через базу данных с помощью запросов или я удаляю базу данных и перебираю файл?

Я попытался объяснить это как можно лучше, это очень запутанный процесс для меня. Я могу прояснить все, что вам нужно. Мне просто нужно руководствоваться тем, каков наилучший способ действий для этого.

+0

** Почему ** вы это делаете? Не можете ли вы прочитать все содержимое в списке и отсортировать его в памяти? –

+0

Его часть личного проекта программирования, с которым я играю.Детали являются неудобными, но я попытался объяснить, установив его как самостоятельную проблему. Я вообще не разбираюсь в этом. –

+0

@ ElliottFrisch Порядок номеров очень важен, поэтому сортировка приведет к поражению цели. Если ты это имеешь в виду. – user3521471

ответ

1

Вот что я хотел бы сделать, если вы были получены последовательности в списке:

List<String> sequences = Arrays.asList("1539638833","6755549201","6443783956","2424553477","1563499332","0279453983"); 
Map<String,Integer> count = new HashMap<>(); 
for (String seq : sequences) { 
    int length = seq.length(); 
    for (int i=0 ; i<length - 2 ; i++) { 
     String sub = seq.substring(i,i + 3); 
     count.put(sub,count.containsKey(sub) ? count.get(sub) + 1 : 1); 
    } 
} 
System.out.println(count); 

Ouput:

{920=1, 783=1, 945=1, 332=1, 963=1, 644=1, 156=1, 983=1, 453=1, 153=1, 388=1, 534=1, 
455=1, 245=1, 539=2, 554=1, 242=1, 555=1, 553=1, 437=1, 883=1, 349=1, 755=1, 675=1, 
638=1, 395=1, 201=1, 956=1, 933=1, 499=1, 634=1, 839=1, 794=1, 027=1, 477=1, 833=1, 
347=1, 492=1, 378=1, 279=1, 993=1, 443=1, 396=1, 398=1, 549=1, 563=1, 424=1} 

Вы можете сохранить эти значения в базе данных с карты.

+0

Да, это определенно часть этого. Следующий вопрос, который я предвижу, состоит в том, что после трех цифр я должен перейти к 4 цифрам, а затем и так далее, но это кажется более простым в сравнении. Кроме того, хотя из-за того, что эти последовательности хранятся в моей базе данных, я полагаю, что лучшим способом было бы запросить его один раз и бросить все последовательности в исходный список? –

+0

Также его сумасшедший, что только три общих числа, найденных там, «539», я действительно ожидал больше, чем только одна найденная последовательность. –

+0

@ RyanBrady: Я также думаю, что это был бы эффективный способ сделать это. Если вы хотите иметь 4 цифры или любое количество цифр, это можно сделать с небольшими изменениями в коде. Наконец, существует всего 1000 возможных комбинаций, и в вашем примере всего 48, поэтому вероятность отсутствия дубликатов довольно высока. – Dici

0

Вы можете сделать это в SQL с пунктом накидной:

select sum(c), sequence 
from 
( 
    select 
     count(*) as c, concat(col1 ,col2 , col3) as sequence 
     from t 
     group by col1, col2, col3 
    union 
    select 
     count(*) as c, concat(col2 ,col3 , col4) as sequence 
     from t 
     group by col2, col3, col4 
    union (... and so on enumerating through the column combinations) 
) as tt 
group by sequence 

Я предположил бы, что чистая реализация Java будет быстрее и меньше накладных расходов памяти. Но если у вас уже есть это в базе данных, это может быть достаточно быстро .

+0

Святая корова. Я не очень хорошо разбираюсь в SQL-запросах, но я даже не думал, что это будет возможно. Когда вы говорите «col1», «col2» и т. Д. Эти столбцы должны удерживать отдельные цифры вправо? Вы ничего не делаете с колонкой, содержащей всю десятизначную последовательность? –

+0

col1 будет «1stNum» для вашего стола.Добавление в столбец из 10 столбцов будет жарить ваши результаты, потому что все группы будут уникальными, если не будет повторяться 10-значный номер. Предложение group by может содержать только столбцы, которые вы группируете. – user17130

+0

Sql действительно не любит, чтобы его записи обрабатывались как массивы. Вот почему это был бы очень подробный запрос, поскольку вы не можете легко индексировать строки, как вы можете, на процедурный язык. Если вы хотите попробовать каждую комбинацию, было бы немного утомительно печатать, но определенно выполнимо. – user17130

Смежные вопросы