Какой из них лучше с точки зрения пространственно-временной сложности? - PullRequest
0 голосов
/ 17 февраля 2019

с точки зрения пространственно-временной сложности, что лучше?

if (!(N % 2 == 0) || N % 2 == 0 && (N >= 6 && N <= 20)) {
  System.out.println("Weird");
} 
if ( N % 2 == 0 && (N >= 2 && N <= 5 || N > 20)) {
  System.out.println("Not Weird");
}

// OR

if (!(N % 2 == 0)) {
  System.out.println("Weird");
} else {
  if (N >= 2 && N <= 5) {
    System.out.println("Not Weird");
  }  if (N >= 6 && N <= 20) {
        System.out.println("Weird");
  }  if (N > 20) {
        System.out.println("Not Weird");
  }
}       

Я пытаюсь понять, является ли лучший способ создать операторы if в Java - сделать простые, но прямые операторы if, такие кактот, что ниже (но немного более грязный) или «аккуратный» сверху.Будем благодарны за каждую мелочь.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Как уже упоминалось, сложность пространства / времени одинакова для обоих случаев.Важным фактором здесь является сложность понимания кода.Это сводится к индивидуальному суждению в конкретных случаях.

Я не уверен, какой из них предпочитаю, потому что я не понимаю алгоритм странности, и мое предпочтение зависит от того, насколько «очевидна» любая формулировка дляинформированный читатель - я предполагаю, что любой, кто прикасается к этому коду, знает, что значит быть странным для N.

Но во втором случае я бы предпочел меньше сравнений.Если одно предложение обрабатывает N <= 5, то следующей альтернативе не нужно обеспечивать N> = 6.

Таким образом (в псевдокоде)

else if (N <= 1) {
   // no decision according to original code
} else if (N <= 5) {
   print not weird   
} else if (N <= 20) {
   print weird
} else {
   print not weird
}

Это тот случай, когда N либостранный или не странный?Затем, во-первых, требуется else, чтобы избежать повторения вычислений, и, во-вторых, вы хотели исключить рассмотрение нулевых и отрицательных целых чисел?(Я спрашиваю об этом с точки зрения того, что мой предложенный макет проясняет, что мы ничего не делаем для таких случаев, и я спорю для ясности изложения - предполагаемый читатель, возможно, должен задаться вопросом об этом очевидном упущении)

Кроме того, в то время как я придираюсь к нитам

(!(N % 2 == 0))

становится более понятным, если записать его как

(N % 2 != 0)
0 голосов
/ 17 февраля 2019

Они идентичны.

Big-O вступает в игру только при наличии петель, они оба работают в постоянном времени O(1).

Как правило, избегайтевложенности.Лично я предпочитаю первый вариант.Но на самом деле нет никакой разницы, особенно из-за короткого замыкания:

Если !(N % 2 == 0) равно true в вашем первом примере, || будет "коротким замыканием", что означает, что, поскольку он нашелправда, он не оценит свою правую половину.То же самое в ваших утверждениях if во втором примере.То же самое относится и к && операторам - они «замыкаются», если сталкиваются с одним значением false, так как они никогда не могут получить истинное значение таким образом.

Так что, по сути, выбирает либочто вы предпочитаете / более читабельно / логически более логично .

...