2017-03-18 4 views
3

Bei einem Array besteht die Aufgabe darin, die größte teilbare Teilmenge im Array zu finden. Eine Teilmenge wird als teilbar bezeichnet, wenn für jedes Paar (x, y) in der Teilmenge entweder x y oder y x teilt.Größte teilbare Teilmenge im Array

Beispiel

Input: arr [] = {1, 16, 7, 8, 4} Output: 16 8 4 1 In der Ausgangsteilmenge, für jedes Paar, entweder das erste Element zweite aufteilt oder zweiteilt zuerst.

Input: arr [] = {2, 4, 3, 8} Ausgang: 8 4 2

Hier ist, was ich mit gekommen sind. Die Zeitkomplexität ist O (n^2). Kann es verbessert werden?

public static int[] largestDivisibleSubset2(int[] a){ 

    Arrays.sort(a); 
    int index=0; 
    int maxDivCount=0; 
    for(int i=0;i<a.length;i++){ 
     int currentDivCount=0; 
     for (int j=i;j<a.length;j++) { 
      if(a[j]%a[i]==0){ 
       currentDivCount++; 
      } 
     } 
     if(currentDivCount>maxDivCount){ 
      index = i; 
      maxDivCount = currentDivCount; 
     } 
     currentDivCount = 0; 
    } 
    int[] res = new int[maxDivCount]; 
    int k=0; 
    for(int i=0;i<a.length;i++){ 
     if(a[i]%a[index]==0){ 
      res[k++] = a[i];    
     } 
    } 

    return res; 
} 
+0

Hinweis: Sie müssen überprüfen, ob Ihr Element ist nicht 0, sonst erhalten Sie 'java.lang.ArithmeticException:/Nach zero' –

+0

Wie groß sind die Zahlen? Es ist möglich, etwas wie "O (N * d + N * sqrt (MAX_VAL))", wobei "d" die maximale Anzahl von Divisoren für alle Elemente des Eingabearrays ist. – kraskevich

+0

Könnten Sie mehr Informationen darüber geben, warum Sie sich Sorgen wegen zeitlicher Komplexität machen (über Einfachheit des Codes)? Vermutlich denkst du über eine große Anzahl von Gegenständen im Set nach? Wenn ja, wollen Sie Antworten, die eine Parellellisierung der Aufgabe beinhalten? – sprinter

Antwort

1

Auf modernen Multi-Core-Maschinen (und die deutlich verbesserten Einrichtungen für von ihnen Gebrauch in Java 8) ist es oft einfacher ist, nach Wegen zu suchen alle Kerne, bevor die Optimierung sequenzielle Bearbeitungszeiten zu verwenden. Dies gilt insbesondere dann, wenn die Verringerung der Zeitkomplexität auch die Lesbarkeit oder Wartbarkeit verringert.

Hier ist zum Beispiel eine Lösung für Ihr Problem, die parallele Streams in Java 8 verwendet, während Sie entscheiden, ob Sie einer Untergruppe einen Wert hinzufügen möchten. Auf meiner eigenen alten Maschine kann sie die größte teilbare Teilmenge von 50.000 zufälligen ganzen Zahlen in 14 Sekunden finden (22 Sekunden, wenn ich die parallel Methode entferne). Es gibt klare Optimierungen, aber wenn es keinen bestimmten Grund gibt, wählen Sie zuerst Klarheit. Vor allem in Interviews :-)

public int[] getSubSet(int... set) { 
    int[] largest = new int[0]; 
    for (int value : set) { 
     int[] subset = Arrays.stream(set).parallel() 
       .filter(n -> n % value == 0 || value % n == 0).toArray(); 
     if (subset.length > largest.length) 
      largest = subset; 
    } 
    return largest; 
} 
+0

Du hast meine Stimme bekommen. Vielen Dank für den hilfreichen Tipp. – intvprep

+0

Theoretisch ist die Komplexität immer noch O (n^2) richtig? – intvprep

+0

Ja, das ist richtig. – sprinter

Verwandte Themen