Autor Beitrag
Truffel
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Sa 29.12.07 20:10 
Hallo,
ich hab folgendes Problem:

In einem Array befinden sich 1000 Zahlen.
Wie viele Vergleiche braucht man um herauszufinden, ob sich die Zahl 517 im Feld befindet.
a) im sortierten Feld
b) im unsortierten Feld

Wäre gut, wenn ihr mir da weiterhelfen könntet, wenn möglich auch mit Begründung, dass ich das auch nachvollziehen kann ;-)
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: Sa 29.12.07 20:14 
Was hast du dir denn schon für Gedanken da drüber gemacht?

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
Truffel Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Sa 29.12.07 20:19 
tut mir leid,aber ich stelle mich in informatik etwas dämlich an...
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: Sa 29.12.07 20:20 
Irgendwas wird dir dabei doch schon einfallen, hier haut dich keiner, auch wenns komplett falsch ist.

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Sa 29.12.07 20:26 
Also, ich erzähl mal was, ok?

Wenn das Array unsortiert ist, was kann man dann machen, um die 517 zu finden? Stell dir vor, du hast 1000 Kartons mit je einer Zahl drin, die in einer großen Lagerhalle stehen. Wie viele Kartons musst du aufmachen, um rauszufinden, ob eine bestimmte Zahl drin ist oder nicht?

Und jetzt der sortierte Fall. Die Kartons mit den Zahlen sind sortiert, d.h. ganz links ist die kleinste Zahl, ganz rechts die größte. Wenn man jetzt zuerst den Karton in der Mitte aufmacht und guckt, was da für ne Zahl drin ist, kann man sich dann evtl. ein paar Kartons bei der Suche nach der 517 sparen? Und wie könnte man dann geschickt weitersuchen?

_________________
We are, we were and will not be.
Truffel Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Sa 29.12.07 20:28 
ich geh mal davon aus, dass das 1 Feldelement mit dem 2. verglichen wird usw.
Also Feld[i-1] wird mit Feld[i] verglichen. Bei 1000 Feldelementen wären das dann 1000 Vergleiche?! Nur wie dann nach einer bestimmten Zahl gesucht werden soll (sortiert, unsortiert) verstehe ich nicht. Ich denke mal, dass ganze liegt "Binary Search" zu Grunde. Ich werde allerdings aus dem Programmcode von "Binary Search" nicht schlau.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Sa 29.12.07 20:31 
Wieso willst du die Zahlen aus zwei Kartons miteinander vergleichen, wenn du eine bestimmt Zahl suchst? Geh erstmal vom Quellcode weg, und versuch das Verfahren zu verstehen. Binärsuche ist schonmal sehr gut (bei sortierten Feldern) :zwinker:

_________________
We are, we were and will not be.
Truffel Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mi 02.01.08 02:30 
ich hab mir überlegt:

beim unsortierten Feld: im besten Fall braucht man 1 Versuch um die gesuchte Zahl zu finden, im schlechtesten Fall braucht man 1000 Versuche die Zahl zu finden. Es ist also eine Suche auf gut Glück.

beim sortierten Feld: Wenn man in der Mitte beginnt, kann man diese mittige Zahl mit der gesuchten Zahl (517) vergleichen, und dann dementsprechend sie Suche nach links oder rechts fortsetzen.

Durchschnittlich betrachtet braucht man dann im sortierten Feld nicht so viele Versuche, wie im unsortierten Feld?!
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mi 02.01.08 03:58 
Ich weiss jetzt nicht, ob der schlechteste Fall gefragt ist, oder die durchschnittliche Anzahl Vergleiche. In der Aufgabe steht auch nicht, dass man einen bestimmten oder möglichst effizienten Algorithmus wählen soll.

user profile iconTruffel hat folgendes geschrieben:
beim unsortierten Feld: im besten Fall braucht man 1 Versuch um die gesuchte Zahl zu finden, im schlechtesten Fall braucht man 1000 Versuche die Zahl zu finden

Man kann also nicht viel machen.

user profile iconTruffel hat folgendes geschrieben:
beim sortierten Feld: Wenn man in der Mitte beginnt, kann man diese mittige Zahl mit der gesuchten Zahl (517) vergleichen, und dann dementsprechend sie Suche nach links oder rechts fortsetzen.

Und wenn du eine Hälfte ausgewählt hast, dann treibst du mir der Hälfte genau wieder das gleiche Spielchen: Du teilst die Hälfte wieder in zwei Hälften. Die Frage ist also: Wieviele Male muss man (im schlimmsten Fall) 1000 in zwei Hälften teilen, bis man bei einer bestimmten Zahl ist? Wie oft kann man denn 1000 durch 2 teilen bis man bei maximal 1 ist?
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mi 02.01.08 11:24 
Die Frage ist schon falsch gestellt.

Es darf nicht heißen 'Wie viele Vergleiche benötigt man....?' sondern z.B. 'Wie viele Vergleiche benötigt man im Mittel ...'. (Huch, hat ja Delfiphan schon geschrieben)

Auf die erste Frage kann man mit 'Woher soll ich das wissen, bin ich Hellseher?' antworten. Die Antwort auf die zweite Frage hingegen kann (hier) mathematisch korrekt gegeben werden.

So, jetzt bis Du wieder dran: Wie wiele Versuche benötigt man im Mittel, um eine bestimmte Zahl in einem beliebigen Array mit 4 Elementen zu finden?

In 1/4 aller Fälle befindet sich die gesuchte Zahl im 1.Karton. Ich benötige also in 1/4 aller Fälle 1 Versuch.
In 1/4 aller Fälle befindet sich die gesuchte Zahl im 2.Karton. Ich benötige also in 1/4 aller Fälle 2 Versuche.
In 1/4 aller Fälle befindet sich die gesuchte Zahl im 3.Karton. Ich benötige also in 1/4 aller Fälle 3 Versuche.
In 1/4 aller Fälle befindet sich die gesuchte Zahl im 4.Karton. Ich benötige also in 1/4 aller Fälle 4 Versuche.
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
  1/4 * 1
+ 1/4 * 2
+ 1/4 * 3
+ 1/4 * 4
==========
  1/4 * 10 = 2,5

Die mittlere Anzahl an Versuchen, um eine Zahl in einem insortierten Array mit 4 Elementen zu finden, ist 2,5.

_________________
Na denn, dann. Bis dann, denn.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 02.01.08 11:34 
Naja...in der Regel fängt man bei sowas aber mit der Worst-Case-Anzahl an. Das ist nämlich in der Regel wesentlich einfacher ;-). Bei der Mid-Case-Analyse muss man in der Regel auch weitere Annahmen machen, wie z.B. dass die Position des gesuchten Elements gleichverteilt ist.

Wie viele man im sortierten Fall maximal braucht, weiß ich grad nicht auswendig, aber ich glaube, das war ganz logisch :mrgreen:.

_________________
We are, we were and will not be.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mi 02.01.08 19:24 
Hi,

ich wollte hier nicht auf die doch relativ komplexe Aufwandsanalyse, insbesondere bei rekursiven Algorithmen, zu denen die binäre Suche gehört, eingehen.
user profile iconGausi hat folgendes geschrieben:
... muss man in der Regel auch weitere Annahmen machen, wie z.B. dass die Position des gesuchten Elements gleichverteilt ist.

Auf die (Gleich-)Verteilung bin ich in meinem Beispiel eingegangen.

Übrigens sind ähnliche Überlegungen auch bei der binären Suche sinnvoll.

Wie hoch ist die Wahrscheinlichkeit, das das gesuchte Element das in der Mitte ist? Diese Frage für jede Unterteilung zu beantworten, bedeutet 90% der Aufgabe gelöst zu haben.

_________________
Na denn, dann. Bis dann, denn.
Truffel Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 03.01.08 02:56 
Ich habe die Augabenstellung fast wörtlich übernommen.
Da also nicht nach dem besten bzw. dem schlechtesten Fall im unsortierten Feld gesucht ist, muss man wohl beide Fälle angeben. Minimal: 1, Maximal: 1000 (wobei dann immer noch nicht gesagt ist, ob sich die Zahl überhaupt darin befindet).
Hierfür ist also die Antwort von alzaimar wohl am besten: 'Bin ich Hellseher?' ^^

@alzaimar:
Du bist in deinem Beispiel davon ausgegangen das sich diese bestimmte Zahl im Array befindet. Das muss aber ja in meinem Beispiel nicht der Fall sein, sie kann darin sein, muss aber nicht.
Dragonclaw
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 196

Windows Vista
Delphi 7 Prof.
BeitragVerfasst: Do 03.01.08 03:58 
Bei der binären suche würde das dann so aus sehen

best case = 1 <= Die gesuchte Zahl ist genau die erste ermittelte Mitte
worst case = ???

Spielen wir ganze mal mit 10 Feldern durch in dem die Zahlen von 1 bis 10 untergebracht werden

Gesucht ist die Zahl 3

Beim ersten Mal ist die Mitte 5. Da 3 < 5 ist wird der rechte Teil ausgeschlossen. Die neue Mitte ist 2
Check ob links oder rechts weiter suchen, da 3 > 2 wird rechts weiter gesucht. Hier startet dann der neue Suchaufruf. Die Mitte ist jetzt 3. Also wurde die Zahl gefunden, 3 Suchaufrufe

Als letzes muss noch der Fall untersucht werden wenn die Zahl nicht im Feld ist.

Wieder ist die 3 gesucht, allerdings sind jetzt nicht mehr die Zahlen von 1 bis 10 im Feld sondern
1 2 4 5 6 7 8 9 10 11

Die Mitte ist hier die 6. Da 3 < 6 wird rechts wieder ausgeschlossen zur neuen Mitte wird die 4, wieder der Check 3 < 4 also wird wieder rechts ausgeschlossen. Die neue Mitte ist 1, der Check liefert das 3 > 1 ist, also wird links ausgeschlossen. und die neue Mitte ist 2. 2 ist kleiner als 3, eigentlich sollte die Mitte neu gesetzt werden, es gibt aber keine Zahlen mehr zum suchen, also bricht der Algo ab und berichtete "Zahl nicht gefunden".Damit hätten wir dann auch den worst case, nämlich 4 Suchaufrufe.


Dafür gibt es aber auch eine Formel, man muss das also nicht für 1000 durchspielen.
Und zwar geht das ganze über die 2er Potenzen, man such sich immer die kleinst mögliche 2er Potenz die allerdings größer ist als die Anzahl der Felder. Der Exponent gibt dann den Worstcase an.

Für 10 Felder 2^4 = 12 , 12 ist görßer als 10. Der Worstcase ist also 4
Für 100 Felder 2^7 = 128, Da ist der Worstcase also 7.
Für 1000 Felder ist der Worstcase also???
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Do 03.01.08 10:33 
user profile iconTruffel hat folgendes geschrieben:
@alzaimar:
Du bist in deinem Beispiel davon ausgegangen das sich diese bestimmte Zahl im Array befindet. Das muss aber ja in meinem Beispiel nicht der Fall sein, sie kann darin sein, muss aber nicht.

Ich habe ja auch den mittleren Aufwand berechnet, und nicht den maximalen. Da sich mein Ergebnis mit dem mathematischen Aufwand deckt, vermute ich eher einen Denkfehler in deinem Einwand (der aber auf den 1.Blick berechtigt erscheint). Überlege mal: Ob ich nun nach 4 Vergleichen die Zahl finde oder nicht, kommt doch aufs Gleiche raus. :wink:

Zur binären Suche (sei n die Anzahl der Elemente in dem Array und die 'Mitte' das Element an der Position (l+r)/2 ):
Die Wahrscheinlichkeit, das die Zahl nach der 1.Teilung in der Mitte ist, ist 1/n.
Die Wahrscheinlichkeit, das die Zahl nach der 2.Teilung in der Mitte ist, ist 2/n. Denn die Zahl kann ja in der linken oder der rechten Hälfte vorkommen.
Die Wahrscheinlichkeit, das die Zahl nach der 3.Teilung in der Mitte ist, ist 4/n. Denn wir haben 4 Teilabschnitte, bei denen wir die Zahl jeweils in der Mitte sein kann.
...
usw.

Nun müssen wir noch klären, wie viele Vergleiche man pro Durchlauf bei einer binären Suche benötigt. Wenn das Element gefunden wurde (1 Vergleich), sind wir fertig. Wenn sich das Element in der linken Hälfte befinden (noch ein Vergleich), müssen wir links weitersuchen, sonst rechts.

Wir benötigen in 1/n aller Fälle 1 Vergleich.
Wir benötigen in 2/n aller Fälle 2+1 Vergleiche. (1.Teilung: 2 Vergleiche, 2.Teilung 1 Vergleich)
Wir benötigen in 4/n aller Fälle 2+2+1 Vergleiche.
...

_________________
Na denn, dann. Bis dann, denn.
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 03.01.08 16:50 
user profile iconTruffel hat folgendes geschrieben:
Hallo,
ich hab folgendes Problem:

In einem Array befinden sich 1000 Zahlen.
Wie viele Vergleiche braucht man um herauszufinden, ob sich die Zahl 517 im Feld befindet.
a) im sortierten Feld
b) im unsortierten Feld

Wäre gut, wenn ihr mir da weiterhelfen könntet, wenn möglich auch mit Begründung, dass ich das auch nachvollziehen kann ;-)


wenn du es sicher finden willst, brauchst du im fall

a) 6,90775579 vergleiche
und im fall
b) 1000 vergleiche

<HTH>
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 03.01.08 16:56 
user profile iconGrenzgaenger hat folgendes geschrieben:

wenn du es sicher finden willst, brauchst du im fall

a) 6,90775579 vergleiche
Damit kommst du nicht aus. Man muss schon den 2er-Logarithmus nehmen, wenn man hier die konkrete Anzahl haben will, nicht den natürlichen ;-). Da 2^9 < 1000 < 2^10 braucht man wohl im schlimmsten Fall 10 Vergleiche.

_________________
We are, we were and will not be.
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 03.01.08 17:00 
user profile iconGausi hat folgendes geschrieben:
user profile iconGrenzgaenger hat folgendes geschrieben:

wenn du es sicher finden willst, brauchst du im fall

a) 6,90775579 vergleiche
Damit kommst du nicht aus. Man muss schon den 2er-Logarithmus nehmen, wenn man hier die konkrete Anzahl haben will, nicht den natürlichen ;-). Da 2^9 < 1000 < 2^10 braucht man wohl im schlimmsten Fall 10 Vergleiche.


hast recht, hab da geschlampert

zu a) 9,965784285 vergleiche

wer's nicht glaubt, kann da mal schnell nachrechnen ... :-)
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Do 03.01.08 20:52 
user profile iconGrenzgaenger hat folgendes geschrieben:

wenn du es sicher finden willst, brauchst du im Fall
a) 6,90775579 vergleiche
und im fall
b) 1000 vergleiche

Nein, denn wenn die gesuchte Zahl im Fall a) an der 500.ten Stelle oder im Fall b) an der 1.Stelle ist, benötige ich nur jeweils einen Vergleich, um es sicher zu finden.

user profile iconGrenzgaenger hat folgendes geschrieben:

hast recht, hab da geschlampert
zu a) 9,965784285 vergleiche
wer's nicht glaubt, kann da mal schnell nachrechnen ... :-)

Kommt drauf an. Wenn man einen Vergleich benötigt, um auf Gleichheit zu prüfen und einen Vergleich, um zu entscheiden, ob man links oder rechts weiter suchen muss, benötigt man um die 17 Vergleiche.

Du rechnest ja jeweils nur den Worst-Case aus, aber das ist -soweit ich das verstanden habe- nicht die Aufgabenstellung. Wobei der Unterschied zwischen 'im Mittel' und 'im schlechtesten Fall' im Falle der Binärsuche keinen großen Unterschied macht (mal log(n)/log(n-1)), wohl aber bei der linearen Suche (mal 2).

Hmm... Die Aufgabenstellung bzw. die Frage ist aber auch blöd, bzw. gar nicht zu beantworten, denn wo ist denn die 517 überhaupt?

_________________
Na denn, dann. Bis dann, denn.
Truffel Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Fr 04.01.08 00:37 
Nur mal so eine Zusatzinfo:
Hab vorhin nachmal nachgeschaut: die Aufgabenstellung ist genauso, wie ich sie hier rein geschrieben hab. Ich bin in der 12. Klasse Informatik GK. Wir haben in der Woche ca. 135 Minuten Informatikunterricht.
Ich nehme mal an, dass ihr alle schon fortgeschritten seit. Sowie ich das sehe, soll diese "kleine" Augabe einfach nur eine Einführung in das Prinzip der binären Suche sein.
Scheinbar seit ihr euch hier auch nicht ganz so einig, was natürlich keine Kritik sein soll.
Ich kann mir nicht vorstellen, dass der Lehrer bei dieser Aufgabe irgendwas mit nem Logarithmus voraussetzt. Scheinbar muss die Aufgabenstellung doch etwas unpassend formuliert sein...