Добавление с помощью стеков? [закрыто]

Либо прочитанная вами статья использовала плохой пример, либо неверно истолковала их точку.

select username from users where company = 'bbc' or company = 'itv';

Это эквивалентно:

select username from users where company IN ('bbc', 'itv');

MySQL может использовать индекс на company для этого запроса просто отлично. Нет необходимости делать какой-либо UNION.

Более сложным является случай, когда у вас есть условие OR, которое включает в себя два разных столбца .

select username from users where company = 'bbc' or city = 'London';

Предположим, что на company есть индекс и отдельный индекс на city. Учитывая, что MySQL обычно использует только один индекс для таблицы в заданном запросе, какой индекс следует использовать? Если он использует индекс на company, все равно придется выполнять сканирование таблицы, чтобы найти строки, где city - Лондон. Если он использует индекс в city, он должен будет выполнить сканирование таблицы для строк, где company - bbc.

Решение UNION предназначено для этого типа случая.

select username from users where company = 'bbc' 
union
select username from users where city = 'London';

Теперь каждый подзапрос может использовать индекс для своего поиска, а результаты подзапроса объединяются с помощью UNION.


Анонимный пользователь предложил изменить мой ответ выше, но модератор отклонил это изменение. Это должен был комментарий, а не редактирование. Требование предлагаемого редактирования состояло в том, что UNION должен сортировать результирующий набор для устранения повторяющихся строк. Это заставляет запрос работать медленнее, и поэтому оптимизация индекса - это стирка.

Мой ответ заключается в том, что индексы помогают уменьшить набор результатов до небольшого числа строк до того, как UNION произойдет. UNION фактически уничтожает дубликаты, но для этого нужно только отсортировать небольшой результирующий набор. Могут быть случаи, когда предложения WHERE соответствуют значительной части таблицы, а сортировка во время UNION столь же дорога, как и простое сканирование таблицы. Но чаще всего результирующий набор уменьшается с помощью индексированных поисков, поэтому сортировка намного дешевле, чем сканирование таблицы.

Разница зависит от данных в таблице, а условия поиск. Единственный способ определить наилучшее решение для данного запроса - попробовать оба метода в профилировщике запросов MySQL и сравнить их производительность.

-1
задан Aaron N. Brock 18 February 2019 в 18:54
поделиться

3 ответа

Вам не нужен внутренний цикл for. Если вы пытаетесь добавить два числа с помощью стека, вы можете поместить их в стек, вытолкнуть и добавить к результату, например, :

Stack<BigInteger> stack = new Stack<BigInteger>();
System.out.println("Please write some pairs of numbers to add by a space: ");

Scanner input = new Scanner(System.in);

for (BigInteger number : input.nextLine().split(" "))
{

BigInteger result = new BigInteger("0");
while (!stack.isEmpty()) {
    result.add(stack.pop());
}
System.put.println("Result : " + result);
0
ответ дан Darshan Mehta 18 February 2019 в 18:54
поделиться

Прежде всего,

for (BigInteger number : input.nextLine().split(" "))

не будет работать, потому что .split() возвращает объект типа String[], и вы не можете напрямую трактовать String как BigInteger. ].

Кроме того, вы удваиваете свои циклы for. Та строка, которую я скопировал выше, , если работает так, как вы хотели, будет перебирать все числа на вашем входе. Так что нет необходимости в этом внутреннем цикле for. На самом деле, он даже не скомпилируется, поскольку BigInteger не имеет метода .length().

Но вы на правильном пути. То, что вы можете сделать, это токенизировать ввод, как вы уже делаете, и поместить каждый элемент в стек как есть. Потому что нет необходимости помещать их в стек как BigInteger. У вас может быть Stack<String>, а затем конвертировать их в BigInteger, когда вы вытаскиваете их обратно, чтобы выполнить сложение. Или, в качестве альтернативы, конвертируйте их в BigInteger, помещая каждый в стек.

0
ответ дан Jordan 18 February 2019 в 18:54
поделиться
input.nextLine().split(" ");

возвращает String[], вы не можете автоматически привести его к BigInteger[], так как это выдаст ClassCastException.

Вы разрешаете десятичные значения? Если это так, вам лучше преобразовать каждый элемент String в примитивное представление double, поскольку вам не понадобится дополнительная точность, предложенная в BigDecimal.

Поскольку десятичные значения не будут разрешены, вам нужно преобразовать String в его integer представление.

for (final String s : input.nextLine().split(" ")) {
   final int value = Integer.parseInt(s);
   stack.push(value);
}

Универсальный тип стека будет Integer. Итак, Stack<Integer>

Рассматривали ли вы случай неправильного ввода данных пользователем? В этом случае вам нужно обработать NumberFormatException

0
ответ дан LppEdd 18 February 2019 в 18:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: