Element in Array finden

Status
Nicht offen für weitere Antworten.

kulturfenster

Bekanntes Mitglied
Es gilt eine rekursive Methode zu schreiben, die ein bestimmtes Element in einem sortierten Array findet.

Die Vorlage sieht folgendermassen aus:

Code:
	public int find(int[] a, int k)
	{
		
	}

Die schnellste mir bekannte Variante ist diejenige, die das mittlere Element des Arrays mit k vergleicht. Falls k noch nicht gefunden wurde, wird geprüft, ob es kleiner oder grösser ist. Je nach dem wird dann die untere oder die obere Hälfte des Arrays nochmals abgecheckt.

Mein Problem nun: Wie kann ich mit dieser Vorlage diesen Ansatz realisieren? Sollte ich dafür nicht noch ein Positionselement mitgeben?

Vielen Dank für Tipps!
 

trazzag

Bekanntes Mitglied
Das klingt mir doch verdammt nach Hausaufgabe... ;-)

Wie kann ich mit dieser Vorlage diesen Ansatz realisieren?

Wie du suchen willst, weißt du ja schon - versuch doch erstmal selbst ein wenig Code auf die Beine zu stellen und wenn du dann konkretere Fragen hast, wird dir bestimmt auch geholfen.
 

kulturfenster

Bekanntes Mitglied
nene, ich erwarte keine Lösung. Es ist eine Aufgabe, ja, aber keine Hausaufgabe.

Hier mein Versuch:
Code:
public int find(int[] a, int k)
	{
		int pos = a.length / 2;
		if(a[pos] == k) return pos;
		if(a[pos] < k) find(a, k-1);
		if(a[pos] > k) find(a, k+1);
		return -1;
	}
Was nun noch nicht stimmt, sind die rekursiven Aufrufe...
 

The_S

Top Contributor
warum veränderst du k? Nach k wird noch gesucht ???:L . Schau dir mal System.arraycopy an!
 
B

Beni

Gast
Wie wäre es mit einer Schleife? Als Stichworte: while, for, ... :bae:
 

trazzag

Bekanntes Mitglied
vielleicht so in etwa (ungetestet):

Code:
public static int find(int[] a, int k)
	   {
	      int pos = a.length / 2;
	      
	      while(a[pos] != k) {

	    	  if(a[pos] > k) pos = pos / 2;  
		  if(a[pos] < k) pos = pos + (pos / 2);

	      }
	      
	      return pos;
	   }
 

The_S

Top Contributor
trazzag hat gesagt.:
vielleicht so in etwa (ungetestet):

Code:
public static int find(int[] a, int k)
	   {
	      int pos = a.length / 2;
	      
	      while(a[pos] != k) {

	    	  if(a[pos] > k) pos = pos / 2;  
		  if(a[pos] < k) pos = pos + (pos / 2);

	      }
	      
	      return pos;
	   }

Auch hier findet nie Rekursion statt :roll:
 

trazzag

Bekanntes Mitglied
Stimmt, und es funzt so eh nicht wirklich (gerade festgestellt).
Die zweite if-Zeile müßte eher so aussehen:

Code:
if(a[pos] < k) pos = pos + ((a.length - pos) / 2);
 

Scotty

Aktives Mitglied
schau mal, das scheint zu funktionieren.
Code:
	public static int find(int[] a, int x) {
		try {
			return find2(a, x);
		} catch(Exception e) {
			return -1;
		}
	}
	
	private static int find2(int[] a, int x) throws Exception {
		int p = a.length / 2;
		if(x < a[p]) {
			if(p == 0) {
				throw new Exception();
			} else {
				int[] a_ = new int[p];
				System.arraycopy(a, 0, a_, 0, p);
				return find2(a_, x);
			}
		} else {
			if(a[p] < x) {
				if(p == 0) {
					throw new Exception();
				} else {
					int[] a_ = new int[a.length-p-1];
					System.arraycopy(a, p+1, a_, 0, a.length-p-1);
					return find2(a_, x) + p +1;
				}
			} else {
				return p;
			}
		}
	}
	
	public static void main(String[] args) {
		int[] a = new int[] { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21 };
		System.out.println(find(a,0));
		System.out.println(find(a,22));
		System.out.println(find(a,1));
		System.out.println(find(a,21));
	}
 

The_S

Top Contributor
Warum wollt ihr alle seine Aufgaben machen? Da lernt er doch dann gar nix mehr dabei, mal ganz davon abgesehen, dass 2 Methoden recht sinnfrei sind ...
 

Scotty

Aktives Mitglied
ich weiß nicht, wie man es mit einer methode lösen kann, ohne eine indexvariable als parameter mitzuführen. wenn sich das element in der oberen hälfte befindet, muss der index als startwert mitgeführt werden. wird das element dann nicht gefunden, so würde -1 zurückgegeben und wegen der addition des startindex wieder erhöht was ein falsches ergebnis zur folge hätte. das ist eigentlich nicht ganz sauber, aber java erlaubt hier einfach eine exception zu werfen und den fehler später abzufangen. möglicherweise könnte man das auch über eine prüfung im rekursionsaufstieg ?(x > -1) umgehen, aber hierfür wäre zusätzlich eine bedingung pro rekursion und speicher für eine hilfsvariable notwendig. außerdem gefällt mir diese variante besser.
 

The_S

Top Contributor
Scotty hat gesagt.:
ich weiß nicht, wie man es mit einer methode lösen kann, ohne eine indexvariable als parameter mitzuführen.

Nochmal System.arraycopy! Passe doch einfach dein Array an, dann klappts auch mit exakt dieser vorgegebenen Methode ;) .
 

Axion

Mitglied
Ich würde mein find nicht so implementieren das es ein aufsteigend sortiertes Array benötigt.


Code:
int[] tmp_ab = {6,5,4,3,2,1};
int[] tmp_auf = {1,2,3,4,5,6};

Beide Arrays sind für mich sortiert.
 

Eldar

Aktives Mitglied
Also entweder ist k die Indexvariable und nicht der gesuchte Wert, oder du benutzt wie der Hobbit im Blutrausch schon sagte einfach die Möglichkeit dein Array zu verändern.
Da du bei jedem Durchlauf ja weißt, dass die Hälfte deines Arrays nicht mehr benötigt wird, kannst du diese auch einfach beim Methodenaufruf der nächsten Rekursion weglassen. Dein zu durchsuchendes Array verkleinert sich immer weiter.
 

trazzag

Bekanntes Mitglied
@Eldar:
Nein, du kannst das Array nicht einfach verkleinern, da er als Rückgabe ja die Position des gesuchten Wertes im ursprünglich übergebenen Array haben wollte...
 

Leroy42

Top Contributor
Hobbit_Im_Blutrausch hat gesagt.:
Nochmal System.arraycopy! Passe doch einfach dein Array an, dann klappts auch mit exakt dieser vorgegebenen Methode ;) .

Jedesmal ein System.arraycopy zu machen ist ja nun total ineffizient.

Wer sagt denn, daß er nur die vorgegebene Methode benutzen darf?

Code:
public int find(int[] a, int k) {return find(a, k, 0, a.length-1);}
public int find(int[] a, int k, int from, int to) {
  if (to < from)
    return -1;
  int mid = (to+from) / 2;
  if (a[mid] == k)
    return mid;
  return k<a[mid] ? find(a, k, from, mid-1) : find(a, k, mid+1, to);
}

Achtung: Ungetestet!
 

kulturfenster

Bekanntes Mitglied
sieht so aus, als hätten hier einige ähnliche Probleme... ;)

Trotzdem danke für die rege Beteiligung. Ich bin nun auf dem richtigen Weg, hab aber leider noch nie mit arraycopy gearbeitet.

Wieso bekomme ich hier eine OutofBundsException?
Code:
if(a[pos] > k) {
			int[] a2 = new int[a.length/2];
			System.arraycopy(a, a[pos+1], a2, a2[0], a.length/2);
			find(a2, k);
		}

Nur zur Sicherheit: ArrayCopy allgemein:
(welcher Array, von welcher Position, in welchen Array kopieren, an welche Position, wieviele Elemente)
stimmt das so?
 

The_S

Top Contributor
kulturfenster hat gesagt.:
Nur zur Sicherheit: ArrayCopy allgemein:
(welcher Array, von welcher Position, in welchen Array kopieren, an welche Position, wieviele Elemente)
stimmt das so?

Steht alles in dem API ;) .

1. Parameter = Ursprüngliches-Array
2. Parameter = ab wo wird vom ursprünglichen Array aus kopiert (indieces fangen bei 0 an)
3. Parameter = Array, in das kopiert werden soll
4. Parameter = ab wo wird in das neue Array kopiert
5. Parameter = Wie viel wird kopiert

trazzag hat gesagt.:
@Eldar:
Nein, du kannst das Array nicht einfach verkleinern, da er als Rückgabe ja die Position des gesuchten Wertes im ursprünglich übergebenen Array haben wollte...

Kann man wohl, du kannst halt nur nicht einfach dein letztes Ergebnis zurückgeben, sondern musst ein bisschen rechnen.

Leroy42 hat gesagt.:
Hobbit_Im_Blutrausch hat gesagt.:
Nochmal System.arraycopy! Passe doch einfach dein Array an, dann klappts auch mit exakt dieser vorgegebenen Methode ;) .

Jedesmal ein System.arraycopy zu machen ist ja nun total ineffizient.

Wer sagt denn, daß er nur die vorgegebene Methode benutzen darf?

Das es effizient ist, habe ich nie behauptet. Aber das ist die einzige Möglichkeit, wenn nur dieser Konstruktor und sonst nichts verwendet werden darf, was man imho aus der Aufgabenstellung raus so interpretieren kann!
 

The_S

Top Contributor
Code:
	   public static int find(int[] a, int k) {
	      
		   int middle = a.length / 2;
		   if (a[middle] == k) {
			   return middle;
		   }
		   else if (a[middle] > k) {
			   int[] temp = new int[middle];
			   System.arraycopy(a, 0, temp, 0, temp.length);
			   return find(temp, k);
		   }
		   else {
			   int[] temp = new int[a.length - middle];
			   System.arraycopy(a, middle, temp, 0, temp.length);
			   return middle + find(temp, k);
		   }
	   }

Ebenfalls ungetestet, setzt voraus, dass die gesuchte Zahl auch wirklich im Array enthalten ist!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Letztes Element im Array finden Java Basics - Anfänger-Themen 3
I Letztes, erstes Element vom Array Java Basics - Anfänger-Themen 9
M Ist es möglich, das größte und zweitgrößte element in einem Array mit nur einer Schleife ausfindig zu machen ? Java Basics - Anfänger-Themen 19
X Array erstes und letztes Element tauschen Java Basics - Anfänger-Themen 2
O Element aus Array löschen Java Basics - Anfänger-Themen 5
M Array immer wieder um ein Element erweitern Java Basics - Anfänger-Themen 6
B Element in Array nach unten verschieben Java Basics - Anfänger-Themen 11
B Methoden Element aus einem Array löschen, Rest nach vorne verschieben? Java Basics - Anfänger-Themen 4
J Variablen Strings mit Zeilenumbrüchen in neues Array Element Java Basics - Anfänger-Themen 1
Ruvok Prüfen ob bestimmtest Element existiert im Array Java Basics - Anfänger-Themen 11
G Element einem Array hinzufügen Java Basics - Anfänger-Themen 7
N Array, Element in Array? Java Basics - Anfänger-Themen 8
C Variablen array element hinzufügen/entfernen Java Basics - Anfänger-Themen 10
K Letzter element aus einem Array Java Basics - Anfänger-Themen 5
M String-Array-Element wieder null zuweisen Java Basics - Anfänger-Themen 16
B Element aus Array entfernen Java Basics - Anfänger-Themen 13
A Array ein element hinzufügen. Java Basics - Anfänger-Themen 6
S element in Array kopieren Java Basics - Anfänger-Themen 12
S Auf Element aus Array zugreifen Java Basics - Anfänger-Themen 6
T Letztes beschriebenes Array-Element ausgeben Java Basics - Anfänger-Themen 6
T Array auf einfaches Element umwandeln Java Basics - Anfänger-Themen 8
J Array: Jedem Element direkt denselben Wert zuweisen Java Basics - Anfänger-Themen 6
P guck ob Element in Array List enthalten ist Java Basics - Anfänger-Themen 2
J Element aus Array entfernen Java Basics - Anfänger-Themen 4
0 Element aus Array löschen andere Elemente verschieben? Java Basics - Anfänger-Themen 7
R jedes X-te Element aus Array entfernen? Java Basics - Anfänger-Themen 3
A array letztes element anzeigen? Java Basics - Anfänger-Themen 5
G Array-Element auf null abfragen Java Basics - Anfänger-Themen 9
D Wie kann ich aus einem File[] (Array) ein Element löschen ? Java Basics - Anfänger-Themen 13
T Array-Element in String schreiben Java Basics - Anfänger-Themen 2
K Wie kann ich ein Element an den Anfang setzten ? Java Basics - Anfänger-Themen 1
pc pc pc pc pc letztes Element eines Arrays n Java Basics - Anfänger-Themen 3
heinrich172 Methoden Trotz gleichem Element stimmt Vergleich nicht? Java Basics - Anfänger-Themen 7
I Element n aus Datenbank Query (JPA / Hibernate) Java Basics - Anfänger-Themen 3
A Jedes zweite Element eines Arrays entfernen Java Basics - Anfänger-Themen 30
O Doppelt verkette Liste Element löschen Java Basics - Anfänger-Themen 15
L Längstes Element einer ArrayList ausgeben Java Basics - Anfänger-Themen 9
districon Element in Liste einfügen Java Basics - Anfänger-Themen 1
Y Wie kann ich ein Element in einer toString finden. Java Basics - Anfänger-Themen 2
J Element aus Liste nehmen Java Basics - Anfänger-Themen 3
S Gibt es ein simples JWebbrowser Element? Java Basics - Anfänger-Themen 6
M Letztes Element einer ArrayList Java Basics - Anfänger-Themen 12
S Streams - kleinstes Element finden Java Basics - Anfänger-Themen 4
V_Fynn03 Beliebiges Element in einer Liste löschen (Java)(Lineare Datenstrukturen) Java Basics - Anfänger-Themen 9
V_Fynn03 Lineare Datenstrukturen Element löschen? Java Basics - Anfänger-Themen 2
J Selektiertes Element von jComboBox zwischenspeichern und wieder einsetzen Java Basics - Anfänger-Themen 0
Curtis_MC Collections Zufälliges Element aus Stack Java Basics - Anfänger-Themen 2
A Konsolenausgabe: Hinter letztes Element ein "}" Java Basics - Anfänger-Themen 2
F nur das erste Element mit iterator ausgeben Java Basics - Anfänger-Themen 5
I Methoden List.contains() beim 2. Element = true Java Basics - Anfänger-Themen 1
AnnaBauer21 org.w3c.dom.Element - Neues Element hinzufügen Java Basics - Anfänger-Themen 4
D doc.seect jsouo bestimmtes class element finden Java Basics - Anfänger-Themen 1
D Selenium Webdrive get x Element Java Basics - Anfänger-Themen 14
W Element aus HashSet in String umformen Java Basics - Anfänger-Themen 7
S Einfach verkettete Liste Element an bestimmter Position einfügen Java Basics - Anfänger-Themen 24
TechGirl JAVA GUI Oberfläche Umkreisung - wie heißt dieses Element? Java Basics - Anfänger-Themen 2
Z Html Element aus der Webseite auslesen Java Basics - Anfänger-Themen 1
A Hash Tabelle Element suchen Java Basics - Anfänger-Themen 1
K Collections Zugriff auf ein bestimmtes Element in der Collection Java Basics - Anfänger-Themen 1
K Element in ArrayList löschen ohne Index zu verschieben Java Basics - Anfänger-Themen 2
W Größtes Element im unsortierten Binärbaum Java Basics - Anfänger-Themen 7
S Günstigstes Element aus einer ArrayList ausgeben Java Basics - Anfänger-Themen 10
N ArrayList: Das zweite Element wird zur Liste nicht eingefügt nach dem zweiten request. Java Basics - Anfänger-Themen 3
A ResultSet: vorheriges Element auslesen Java Basics - Anfänger-Themen 10
F Element aus LinkedList löschen Java Basics - Anfänger-Themen 3
J Element zu jList hinzufügen NullPointerExcepetion Java Basics - Anfänger-Themen 2
H Kein Zugriff auf das Element einer JList möglich: Fehlermeldung Java Basics - Anfänger-Themen 2
V wie kann man am einfachsten für ein Element der JavaFX die Umrandung aktiwieren ? auch ohne css ? Java Basics - Anfänger-Themen 4
D Fehlermeldung "com.element.JavaUpload.Manager" Java Basics - Anfänger-Themen 1
S Element von List<E> in String umwandeln Java Basics - Anfänger-Themen 3
I Element löschen aus der Liste Java Basics - Anfänger-Themen 2
G element in ArrayList Hinzufügen Java Basics - Anfänger-Themen 16
M ArrayList-Element hinzufügen u. löschen Java Basics - Anfänger-Themen 2
H Möglichkeit, mehrere Element zu speichern Java Basics - Anfänger-Themen 8
P Element aus einer einelementigen Menge bekommen. Java Basics - Anfänger-Themen 8
R Mit iterator auf Element zugreifen Java Basics - Anfänger-Themen 2
Madlip Erste Schritte Das 4. Element?!? Java Basics - Anfänger-Themen 2
B Erstes Element eines Vectors erhalten Java Basics - Anfänger-Themen 5
Q queue.remove Element trotzdem noch vorhanden. Java Basics - Anfänger-Themen 10
H Zugriff auf Vector Element Java Basics - Anfänger-Themen 2
I Liste Remove erstes Element Java Basics - Anfänger-Themen 5
M Map mit Vektor: Element hinzufügen Java Basics - Anfänger-Themen 21
M element aus DB lesen Java Basics - Anfänger-Themen 4
S JDBC MySQL Connector - Element mit ' eintragen? Java Basics - Anfänger-Themen 4
R Element an ArrayList<int[]> "anonym" adden? Java Basics - Anfänger-Themen 3
Glühwürmchen Prüfen ob Element in ArrayList Java Basics - Anfänger-Themen 23
C Ausgewähltes Element einer JCombobox in JTextField Java Basics - Anfänger-Themen 3
L Element in Mitten eines Arrays einfügen Java Basics - Anfänger-Themen 3
S ArrayList nur ergänzen wenn Element noch nicht vorhanden Java Basics - Anfänger-Themen 4
3 3. Element mit regulären Ausdruck suchen Java Basics - Anfänger-Themen 12
S Auf Element in Arry zugreifen Java Basics - Anfänger-Themen 7
B Element in Folge suchen Java Basics - Anfänger-Themen 7
H Zeiger auf das letzte Element in einer linearen Liste Java Basics - Anfänger-Themen 4
H LinkedList Element an Stelle x ausgeben? Java Basics - Anfänger-Themen 5
S Datentypen In ArrayList nach Element suchen und Position ausgeben Java Basics - Anfänger-Themen 9
M Wert soll element aus den natürlichen Zahen inkl. 0 sein Java Basics - Anfänger-Themen 6
E TreeSet Element löschen Java Basics - Anfänger-Themen 9
J Stapel oberstes Element entfernen Java Basics - Anfänger-Themen 5
C Erstes Arraylist Element in for Schleife überspringen Java Basics - Anfänger-Themen 6
F jTable - neues Element vorher auf existenz Prüfen Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben