2016-12-17 6 views
0

eine Reihe von leeren Arrays in Ruby Gegeben:Was ist der effizienteste Weg um festzustellen, ob ein zweidimensionales Ruby Array leer ist?

a = [ [], [], [], [], [] ] 

Sie können bestimmen, ob alle Unterfelder Arrays leer sind:

a.uniq.length == 1    # Ignoring the flaw where sub-arrays are identical 
a.index { |item| item != [] }.nil? 
a.flatten.empty? 
a.all? { |item| item.empty? }   # Fastest of the four 

Die obigen Ansätze sind von langsamste aufgeführt schnellsten. Gibt es einen schnelleren Weg als mit a.all? { |x| x.empty? }.

Antwort

3

Ich wäre überrascht, wenn Sie einen schnelleren Weg finden:

array.all? { |element| element.empty? } 

Welche Art von Sinn macht, wenn wir sehen, wie sie funktionieren. Dies betrachtet jedes Element, wenn es leer ist, aber stoppt, sobald ein nicht leeres Element vorhanden ist. Das bedeutet, es dauert maximal n Schritte und ändert das Array nicht.

Während die meisten anderen Beispiele das Array ändern. Das bedeutet, dass sie Speicher reservieren und Daten kopieren müssen. Wenn Sie die Daten zuerst manipulieren, brauchen Sie genau n Schritte plus die Prüfungen danach.

+0

Ja, ich frage mich, ob es im schlimmsten Fall einen cleveren Weg gibt, das schneller als O (n) zu machen. – ybakos

+0

Ich würde argumentieren, wenn Sie ein Array haben und überprüfen müssen, ob eines der Sub-Arrays nicht leer ist, dann gibt es keinen schnelleren Weg als 'O (n)', weil Sie im schlimmsten Fall alle Sub-Arrays überprüfen müssen. – spickermann

+0

Ich sehe auch nicht, wie es schneller sein könnte. @spickermann: Kleiner Nitpick: Die anderen Beispiele ändern das Array nicht. Sie schaffen ein neues, das Zeit und Gedächtnis braucht. –

Verwandte Themen