Zurück tutorials.de > Programming > C/C++

 
 
Hallo und herzlich willkommen! Tutorials.de ist eine Hilfe-Community mit dem Motto User helfen Usern. Als Gast verfügst Du über Schreibrechte in unseren Foren und Blogs. Du kannst dich aber gerne auch kostenlos registrieren und Teil unserer Gemeinschaft werden! Viel Spaß & Erfolg bei der Vermehrung deines Wissens :-)

Themen: 242.975 | Beiträge: 1.352.293 | Mitglieder: 169.418 (Stand 28.01.10) | Fragen zur Nutzung von Tutorials.de? Nutzungsregeln | Kontaktformular | Impressum

Jubiläums-Countdown 23.02 23.03 23.04 23.05 23.06 23.07 23.08 23.09


4 kostenlose Bücher bei unserer Buch-Verschenkaktion 03/2010
  AntwortAntworten (über Gastzugang)    
  AntwortAntworten (über Gastzugang)    
 
Themen-Optionen Ansicht
Alt 09.02.10, 16:24   #1 (permalink)
Grünschnabel
 
Registriert seit: Feb 2010
Beiträge: 2
Renommee-Modifikator: 0
oliolioli hat eine blütenweiße Weste

Frage Binäre Suche mit Zahlenblöcke

Hallo alle Miteinander!
Brauche dringend Hilfe
Ich hab vor 2 Wochen mit C++ programieren angefangen und soll nun von meim Praktikum aus ein Suchprogramm schreiben dass aus einer sortierten Liste von (Telefon-)Nummern (ca. ne millionen stk.) eine eingegebene Nummer sucht und dir sagt ob diese dabei ist oder nicht. Ich hab mich für die Binäresuche entschieden und bissher funktioniert das Programm auch ganz gut.
Dass problehm ist jetzt: Dass es Nummerblöcke gibt (10er; 100; oder auch 1000er Blöcke ) z.B. :
1
2
3
4
5
6
7
8
9
10
20
Also zwischen 10 und 20 wäre jetzt so ein Block.
Wie kann ich dem Programm sagen das es sich:
1.) um einen solchen Block handelt (denn es gibt NICHT alle Zahlen)
2.) dass alle Zahlen innerhalb von so einem Block vorhanden sind? (d.h. dass 10; 11;12;13;14;15;16;17;18;19;20 sehrwohl dabei sind)

Meine Idee bisher ist: Dass ich Zwischen Blöcke wie: 10 und 20 ein Zeichen einbau. Z.B. ein *.
8
9
10
*
20
Frage 1: Kann ich dem programm dann sagen, dass sich alle Zahlen vor und nach diesem bis zum vorherigen und zum nächsten (also von 10 bis 20) vorhanden sind?
Frage2 : Geht dass und oder Wie geht dass?
Frage 3 : Ist ein * überhaupt geeignet dafür?



Ein RIEßEN Dankeschön schonmal im vorraus!
Hir meine bisherige Binäresuche:

c++ Code:
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
using namespace std;
 
void einfacherTest();
void TestMitEinlesen();
 
 
int main( int nargs, char **args )
{
  TestMitEinlesen();
 
  return 0;
} // main( int nargs, char **args )
 
 
 
 
 
double *binsuch( double feld[], size_t l, double zusuchen )
{
  if( l<1 )
  {
    // leeres Feld? Nichts gefunden!
    return NULL;
  }
  else if( l==1 )
  {
    // nur ein Element; vergleichen und ggf. zurückgeben:
    return ( feld[0]==zusuchen ? &feld[0] : NULL );
  }
  else
  {
    // Mehr als ein Element
    // Mitte suchen, und ggf. links oder rechts suchen:
    int index_Mitte = l/2;
    if( feld[index_Mitte]==zusuchen )
    {
      // Zufällig getroffen!
      return &feld[index_Mitte];
    }
    else if( feld[index_Mitte]>zusuchen )
    {
      // Mitte ist zu groß, also links weitersuchen
      return binsuch( feld, index_Mitte, zusuchen );
    }
    else
    {
      // Mitte zu klein, also in rechter Hälfte suchen:
      return binsuch( &feld[index_Mitte+1], l - index_Mitte - 1, zusuchen );
    }
  }
 
} // int *binsuch( int feld[], size_t l, int zusuchen )
 
 
void TestMitEinlesen()
{
  // Datei mit den sortierten Werten:
  string Dateiname;
  cout << "Bitte den Namen einer Datei mit sortierten int-Werten:" << endl;
  cin >> Dateiname;
 
  double *arr = NULL;
  size_t larr = 0;
 
  { // Einlesen
    ifstream f( Dateiname.c_str() );
    double wert;
    while( ( f>>wert ) )
    {
      // Feld um ein Element verlängern:
      arr = (double*)realloc( arr, ++larr*sizeof(double) );
      if( !arr )
      {
        cerr << "kein Speicher!\n";
        exit( 1 );
      }
      arr[larr-1] = wert;
    }
  } // Einlesen
 
  { // Testen, ob sortiert
    for( size_t i=1; i<larr; i++ )
    {
      if( !( arr[i-1]<arr[i] ) )
      {
        cerr << "Feld nicht sortiert!\n";
        exit( 1 );
      }
    }
  } // Testen, ob sortiert
 
  // Welcher Wert soll gesucht werden?
 
for(;1==1;){
  cout << "Gesuchten Wert eingeben:" << endl;
  double gesucht;
  cin >> gesucht;
 
  double *p_gefunden = binsuch( arr, larr, gesucht );
  if( p_gefunden )
  {
    cout << "In " << Dateiname << " gefunden: " << *p_gefunden << endl;
  }
  else
  {
    cout << "Wert in " << Dateiname << " nicht gefunden." << endl;
  }
  }
  // allokierten Speicher wieder freigeben:
  free( arr ); arr = NULL; larr = 0;
 
  system("pause");
 
} // void TestMitEinlesen()

Geändert von Maik (09.02.10 um 16:28 Uhr). Grund: Quellcode in Syntax-Highlighter gepackt
  oliolioli ist offline  
 
Alt 09.02.10, 16:27   #2 (permalink)
mod | designengineer
 
Benutzerbild von Maik tutorials.de Moderator 
 
Registriert seit: Nov 2003
Ort: 49°23'55'' N, 8°37'50'' O
Beiträge: 28.639
Renommee-Modifikator: 204
Maik ist ein absoluter Guru auf tutorials.deMaik ist ein absoluter Guru auf tutorials.deMaik ist ein absoluter Guru auf tutorials.deMaik ist ein absoluter Guru auf tutorials.deMaik ist ein absoluter Guru auf tutorials.deMaik ist ein absoluter Guru auf tutorials.deMaik ist ein absoluter Guru auf tutorials.deMaik ist ein absoluter Guru auf tutorials.deMaik ist ein absoluter Guru auf tutorials.deMaik ist ein absoluter Guru auf tutorials.deMaik ist ein absoluter Guru auf tutorials.de

AW: Binäre Suche mit Zahlenblöcke

Hi,
Zitat:
Zitat von oliolioli Beitrag anzeigen
Ich hab vor 2 Wochen mit C++ programieren angefangen und soll nun von meim Praktikum aus ein Suchprogramm schreiben
deinen Beitrag hast du im Forum für die Formatierungssprache CSS (Cascading Stylesheets) reingestellt

Ich leite deine Fragen dann mal an unser "C/C++"-Fachforum weiter.

mfg Maik
__________________
  • Ich biete keinen Support via PN, Skype, ICQ & Co - dafür ist das Forum da!
  • Beantwortete Fragen bzw. gelöste Themen bitte als erledigt markieren - vielen Dank!
______________________________________________________________________________________________
Interpol und Deutsche Bank, FBI und Scotland Yard, Finanzamt und das BKA haben unsere Daten da.

[ Kraftwerk - Computerwelt - 1981 ]
  Maik ist gerade online  
 
Alt 09.02.10, 20:41   #3 (permalink)
Mitglied Diamant
 
Registriert seit: Jun 2005
Beiträge: 5.912
Renommee-Modifikator: 53
deepthroat ist berühmt wie kein Zweiterdeepthroat ist berühmt wie kein Zweiterdeepthroat ist berühmt wie kein Zweiterdeepthroat ist berühmt wie kein Zweiterdeepthroat ist berühmt wie kein Zweiterdeepthroat ist berühmt wie kein Zweiterdeepthroat ist berühmt wie kein Zweiterdeepthroat ist berühmt wie kein Zweiterdeepthroat ist berühmt wie kein Zweiterdeepthroat ist berühmt wie kein Zweiterdeepthroat ist berühmt wie kein Zweiter

AW: Binäre Suche mit Zahlenblöcke

Hi.

Also erstmal hättest du dir gar nicht soviel Arbeit machen müssen. Die STL bietet bereits einen binary_search Algorithmus bzw. den std::lower_bound Algorithmus an.

Außerdem gibt es auch einen adjacent_find Algorithmus, mit dem man prüfen kann, ob eine Sequenz sortiert ist:
cpp Code:
  1.  
  2.  
  3.  
if (std::ajdacent_find(arr, arr + larr, std::greater_equal()) == (arr + larr)) {
  // sortiert bzw. keine Duplikate enthalten
}

Was ist das denn für ein Projekt? Eine Übungsaufgabe? Oder steckt da etwas Ernsthaftes dahinter?

Dann sollte man sich überleben ob es so günstig ist ein Array für die Speicherung zu benutzen. Ein Baum (z.B. Präfixbaum) würde sich da evtl. eher anbieten. Jetzt hast du ja nur double, die üblicherweise 8 Byte groß sind. sind also schon 8 MB.

Das Problem mit den Blöcken könntest du mit einer Klassenhierarchie lösen, wo eine Range definiert wird:
cpp Code:
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
class Entry {
public:
  virtual bool matches(double) const = 0;
  virtual bool operator<(double) const = 0;
};
 
class Range : public Entry {
  double m_lower, m_upper;
public:
  Range(double lower, double upper) : m_lower(lower), m_upper(upper) {}
 
  virtual bool matches(double v) const {
    return m_lower <= v && v <= m_upper;
  }
  virtual bool operator< (double v) const {
    return v < m_lower;
  }
};
 
int main( int nargs, char **args )
{
  Entry* v[] = { new Range(30., 35.) };
  size_t v_size = sizeof(v)/sizeof(*v);
  Entry** v_end = v + v_size;
 
  double value = 31.;
 
  Entry** p = std::lower_bound(v, v_end, value, std::mem_fun(&Entry::operator<));
 
  if (p == v_end) {
    cout << "no" << endl;
  } else if ((*p)->matches(value)) {
    cout << "yes" << endl;
  }
}
__________________
.:Mitglied des 1. offiziellen Sven Uwe Fan-Clubs:.

Geändert von deepthroat (10.02.10 um 12:32 Uhr).
  deepthroat ist offline  
 
Alt 10.02.10, 09:35   #4 (permalink)
Grünschnabel
 
Registriert seit: Feb 2010
Beiträge: 2
Renommee-Modifikator: 0
oliolioli hat eine blütenweiße Weste

positiv AW: Binäre Suche mit Zahlenblöcke

Vielen Dank für die hilfreiche antwort!! Ich versuch dass glaich mal umzusetzen.
Dass Programm is sowol Übungsaufgabe also auch ernst zugleich. Es soll später dazu dienen, Anrufe, die über einen unserer Serverlaufen, möglichst schnell einem Provider zuzuorden. (die tel. nummern sind in einer dazugehörigen Liste gespeichert.) Es soll nur sagen. Ja die nummer ist dabei/nicht dabei...
mfg oli
  oliolioli ist offline  
 


Themen-Optionen
Ansicht
Ähnliche Themen
 
Thema Autor Forum Antworten Letzter Beitrag
Binäre Suche Java Saban Java 13 25.02.09 15:59
Binäre Suche cuchulainn Algorithmen & Datenstrukturen mit Java 8 14.07.08 22:52
Berechnung der Mitte der Liste für binäre Suche schlägt fehl xbugsx C/C++ 0 20.11.07 03:29
binäre Suche djroque Java 4 15.01.05 16:06
Binäre suche kle-ben Visual Basic 6.0 9 22.12.04 08:08
» Tools
 
tutorials.de-Tools tutorial.de-Suchfeld tutorial.de-Widget tutorial.de-RSS-Feed tutorial.de-Banner
» Neue Links
 
Hits: 134
»
JHT's Planetary...
(Cinema 4D-Objekte)
Hits: 261
»
Tageslicht ohne GI
(Cinema 4D-Tutorials)
Hits: 149
»
Puzzle
(Cinema 4D-Tutorials)
Hits: 100
»
Lacreme
(Cinema 4D-Tutorials)
Hits: 190
»
Liquid Light
(Cinema 4D-Tutorials)
» Aktuelle Umfrage
 
Bist du mit der Geschwindigkeit der Tutorials.de-Website zufrieden?
Ja, es putzt mir glatt den Staub vom Bildschirm! - 79,79%
150 Stimmen
Nein, ich denke da muss noch nachgebessert werden... - 20,21%
38 Stimmen
Stimmen gesamt: 188
Du darfst bei dieser Umfrage nicht abstimmen.

 

Alle Zeitangaben in WEZ +1. Es ist jetzt 07:14 Uhr.


Powered by vBulletin® Version 3.8.5 (Deutsch) & vBadvanced CMPS v.3.2.0
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.5.0 RC2 ©2010, Crawlability, Inc.
Alle Rechte vorbehalten ©2000 - 2010 tutorials.de
Design by Mark, CSS by Maik & Sven Mintel
Seite generiert in 0,28001 Sekunden mit 26 queries