Repräsentative Zahl für einen String

09/12/2010 13:13 lolkop#16
das problem ist, das deine beiden kriterien sich gegenseitig ausschließen. um das zweite kriterium zu erfüllen, müsste man den buchstaben eine zahl zuweisen, die auf basis der stellung im alphabet erstellt wurde.

das ganze lässt sich recht leicht umsetzen. man könnte zb auf 2er potenzen basis arbeiten.
also zb array der buchstaben erstellen:
Code:
buchstabe[26] = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
(man kann das natürlich auch in einer schleife über ascii umwandlung erledigen)

und dann jedem im string vorkommenden buchstabe, 2^arrayposition zuordnen und alle resultierenden zahlen addieren. so wäre rein logisch gesehen die kollisionsrate = 0. man könnte sogar noch im nachhinein genau bestimmen, welcher buchstabe wie oft im string vorkam.

das problem ist wenn man den buchstaben so zahlen zuordnet, kann man zb "ab" nichtmehr von "ba" unterscheiden im nachhinein.

wenn du auch die reihenfolge der buchstaben als wichtig erachtest, musst du den string als array von buchstaben betrachten, und diese auch dementsprechend in ein array aus zahlen umwandeln (einfach über ascii tabelle).
es ist definitiv nicht möglich einem string eine einzige zahl zu zuweisen, und dabei noch beide deiner kriterien zu erfüllen. das lässt sich wie bereits erwähnt nur über arrays von buchstaben/zahlen lösen.
09/12/2010 14:32 Bot_interesierter#17
Wenn man die String Länge nicht erfasst kann man unmöglich auf die Zahl der vorkommenden Buchstaben schließen, es gibt nämlich schöne Kollisionen wie 'ii'=1024 und 'j'=1024 das gleiche gilt auch für 'aa'=2 'b'=2 und so weiter.

Und was der TE wirklich möchte ist wohl eher etwas anderes, wenn ich ihn richtig Verstehe möchte er eine Binäre Suche auf ein Array von Strings anwenden, dazu muss nur das Array Alphabetisch sortiert sein, wofür er natürlich eine Vergleichsfunktion benötigt um das Array zu sortieren.
Für ein Array von ASCII Strings verwendet man am besten einen std::vector<std::string>, dann kann man auch einfach std::sort und std::binary_search verwenden, wenn du natürlich zu lernzwecken die Funktionen selbst schreiben willst, dann benutzt wenigstens ein std::string array, denn mit char* wird das einfach nur unschön und du musst dich auch noch um den Speicherplatz für die Strings kümmern.
09/12/2010 15:03 lolkop#18
Quote:
Originally Posted by Bot_interesierter View Post
Wenn man die String Länge nicht erfasst kann man unmöglich auf die Zahl der vorkommenden Buchstaben schließen, es gibt nämlich schöne Kollisionen wie 'ii'=1024 und 'j'=1024 das gleiche gilt auch für 'aa'=2 'b'=2 und so weiter.

Und was der TE wirklich möchte ist wohl eher etwas anderes, wenn ich ihn richtig Verstehe möchte er eine Binäre Suche auf ein Array von Strings anwenden, dazu muss nur das Array Alphabetisch sortiert sein, wofür er natürlich eine Vergleichsfunktion benötigt um das Array zu sortieren.
Für ein Array von ASCII Strings verwendet man am besten einen std::vector<std::string>, dann kann man auch einfach std::sort und std::binary_search verwenden, wenn du natürlich zu lernzwecken die Funktionen selbst schreiben willst, dann benutzt wenigstens ein std::string array, denn mit char* wird das einfach nur unschön und du musst dich auch noch um den Speicherplatz für die Strings kümmern.
da hast du natürlich vollkommen recht. habe vergessen zu erwähnen das man die stringlänge natürlich immer mit speichern muss >.<

dennoch war ja seine hauptfrage ob es möglich ist, einem string eine zahl zu zuweisen und dabei noch die beiden kriterien zu berücksichtigen. und das ist leider nicht möglich.
09/12/2010 16:17 Bot_interesierter#19
Seine Hauptfrage ging allerdings davon aus das er für die Binarysearch den Strings überhaupt eine Zahl zuweisen muss, was nicht der Fall ist, weshalb das ganze gerede über Hashs und CRCs dem TE in keinster Weise hilft der Lösung seines Problems näher zu kommen.
09/12/2010 19:31 Madd Eye#20
machs doch einfach so:

versuchs mal mit der:
Code:
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <time.h>


using namespace std;

char get_string_num(char eingabe[])
{
	char summe;
	char * text = strtok(eingabe, "");
	int textsize = sizeof( text );

	char * krypt[textsize];
	int versetzung = 0;

/* Zufallszahl erzeugen */
   	time_t t;

    	time(&t);
    	srand((unsigned int)t); 

	int zufall = rand() % textsize + 1;

	summe += zufall;

/* Text kryptokrafieren */
	for( int i = 0; i < textsize; i++ )
	{
		if(i+zufall>textsize)
		{
			versetzung = i+zufall-extsize;
		}
		krypt[verstzung] = text[i];
	}

	for( int i = 0; i < textsize; i++ )
	{

		summe += kyrpt[i];
	}


	return summe;
}

int main()
{
     char eingabe[256]
     while(1)
     {
       cin >> eingabe;
       char ausgabe = get_string_num(eingabe);
       cout << ausgabe << endl;
     }
  
     return 0;
}
Der Code vreschlüsselt den String nach der Cäsar methode mit einer Zufallszahl und kettet dann die ASCII Werte hintereinander
Die erste Ziffer ist die zufallszahl mit der Verschlüsselt wurde damit man wieder ohne Probleme entschlüsseln kann

Mit der Mehtode hast du eine Sehr minimale Kollisionrate (was nach deinem ersten post in ordnung ist) und kann den Zahlenwert ohne probleme in einen String zurückwandeln

Beispiel für den code:

String = Hallo
Zufallszahl = 2

Cäsar Methode
String = loHal

ASCII = 1081117297108

End Ausgabe: 21081117297108
09/12/2010 22:49 MrSm!th#21
Vielleicht solltest du mal besser lesen, es geht hier nicht darum, etwas zu verschlüsseln, sondern um eine Binäre Suche von Strings, die der TE mithilfe von String repräsentativen Zahlen implementieren wollte.
09/12/2010 22:54 Madd Eye#22
Ist mir schon klar nur damit hat er dann einen Repäsentativen werde der eigentlich nur einmal bis max. zweimal vorkommt
09/12/2010 23:40 MrSm!th#23
Toll, dafür hat er nen gleichlangen verschlüsselten String ;O Kann er auch gleich den normalen nehmen.
09/15/2010 17:45 .nAno#24
Entschuldigt, dass ich nicht mehr geantwortet hab, ich hab allerdings eben selber eine (zwar noch ausbaufähige, aber) funktionierende Möglichkeit gefunden.
Für alle die es auch mal interessieren könnte, hier mein Code:

PHP Code:
double stringRepresent (charchrArrint count)
{
    
int const conversionNr87;
    
int conversionRes;
    
int basicchrArr[0] - conversionNr;
    
double resultbasic;

    
cout << basic << "\n";
    
cin.get();

    for( 
int i=1<= count 2i++)
    {
        
conversionReschrArr[i] - conversionNr;
        
cout << conversionRes << "\n";
        
cout << conversionRes multiply0.01i) << "\n";
        
result += conversionRes multiply0.01i);
    }
    return 
result;

Bei multiply() handelt es sich um ne kleine Hilfsfunktion zum potenzieren.

Das verbleibende Problem ist nun, dass durch diese Methode z.B. "aaa" = 10.11 und ebenfalls "ab" = 10.11 ist.
Ich halte es für schlecht das mit nem einfachen If zu lösen (da das zu lahm wäre und dies den Algo ausbremst).
Vielleicht kann mir da wer weiterhelfen (da das Problem warscheinlich nen häufigeres Problem sein dürfte ;))