Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 19:05

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Alogrithmus der Palindrome herausfindet?

Discussion on Alogrithmus der Palindrome herausfindet? within the C/C++ forum part of the Coders Den category.

Closed Thread
 
Old   #1
 
*-_JuLi²_-*'s Avatar
 
elite*gold: 8
Join Date: Mar 2010
Posts: 4,272
Received Thanks: 1,053
Alogrithmus der Palindrome herausfindet?

Hey Leute, ich hab mal eine kleine Frage an euch. Undzwar brauche ich ein Programm das aus einer Textdatei so schnell wie möglich die Anzahl der Palindrome (=Wörter die rückwärts gelesen das gleiche sind (anna, lol,...)) herausfindet und ausgibt. Klein-Großbuchstaben müssen beachtet werden (Anna gilt in dem Fall nicht, anna schon).
Ich brauch eigentlich nur den Alogrithmus, der schnellere bekommt meine 8e*g. :b
*-_JuLi²_-* is offline  
Old 10/16/2014, 17:23   #2
 
elite*gold: 46
Join Date: Oct 2010
Posts: 782
Received Thanks: 525
Code:
#include <iostream>
#include <string>

inline bool is_palindrome(const std::string& in)
{
	std::string reverse(in.rbegin(), in.rend());
	return reverse == in;
}

int main(int, char**)
{
	std::string a = "anna";
	std::string b = "Anna";
	std::cout << is_palindrome(a);
	std::cout << is_palindrome(b);
}
Gibt 1 und dann 0 aus (true, false). Da könnte man schon drauf kommen ...

Edit: Das ist c++ und von c der c standart library habe ich nicht viel Ahnung. Und um das zählen zu können musst du wissen, ob es eins ist.
th0rex is offline  
Old 10/16/2014, 17:39   #3
 
*-_JuLi²_-*'s Avatar
 
elite*gold: 8
Join Date: Mar 2010
Posts: 4,272
Received Thanks: 1,053
Quote:
Originally Posted by omitma View Post
Code:
#include <iostream>
#include <string>

inline bool is_palindrome(const std::string& in)
{
	std::string reverse(in.rbegin(), in.rend());
	return reverse == in;
}

int main(int, char**)
{
	std::string a = "anna";
	std::string b = "Anna";
	std::cout << is_palindrome(a);
	std::cout << is_palindrome(b);
}
Gibt 1 und dann 0 aus (true, false). Da könnte man schon drauf kommen ...
Ist das C++? Vergessen zu sagen, nur C bitte und eher für anfänger :b

Ich brauche keinen algorithmus der mir ausgibt ob es ein Palindrom ist oder nicht sondern eins das zählt wieviele in dem Textdokument sind.
*-_JuLi²_-* is offline  
Old 10/16/2014, 18:45   #4
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
Code:
bool IsPalindrom(char* a, size_t Length)
{
	for (char* Temp = a + Length - 1; Temp >= a; Temp--, a++)
	{
		if (*a != *Temp)
		{
			return false;
		}
	}
	return true;
}

void PrintPalindromesInText(char* Text)
{
	int Found = 0;
	
	while (*Text != '\0')
	{
		size_t TempLen = 0;
		char* Temp = Text;
		while (isalpha(*Temp))
		{
			*Temp++;
			TempLen++;
		}
		if (IsPalindrom(Text, TempLen))
		{
			puts("Found: ");
			for (size_t i = 0; i < TempLen; i++)
			{
				putchar(Text[i]);
			}
			putchar('\n');
			Found++;
		}
		Text += TempLen+1;
	}

	printf("Found %d Palindromes!\n", Found);
}

//aufzurufen z.b.:
PrintPalindromesInText("huhu test anna qwer alla butter reger abba cdddc");
kann man mit strtok noch verkürzen wenn man alle delimiter kennt, ich habs jetzt umgekehrt gemacht und nur das alphabet als gültige zeichen zugelassen.

EDIT:
hier die strtok version:
Code:
void PrintPalindromesInText(char* Text)
{
	int Found = 0;

	char* Buffer = new char[strlen(Text) + 1];
	strcpy(Buffer, Text);
	const char* Seperators = " ,.!?;\t\n";

	char* Token = strtok(Buffer, Seperators);
	
	while (Token)
	{
		if (IsPalindrom(Token, strlen(Token)))
		{
			printf("Found: %s\n", Token);
			Found++;
		}
		Token = strtok(NULL, Seperators);
	}

	printf("Found %d Palindromes!\n", Found);
}
anwendung genauso wie oben.

den string neu zu kopieren kann man sich sparen wenn man den text vorher in nem veränderbaren buffer hat und nicht als const string übergibt.
Dr. Coxxy is offline  
Thanks
1 User
Old 10/16/2014, 19:20   #5
 
*-_JuLi²_-*'s Avatar
 
elite*gold: 8
Join Date: Mar 2010
Posts: 4,272
Received Thanks: 1,053
Quote:
Originally Posted by Dr. Coxxy View Post
Code:
bool IsPalindrom(char* a, size_t Length)
{
	for (char* Temp = a + Length - 1; Temp >= a; Temp--, a++)
	{
		if (*a != *Temp)
		{
			return false;
		}
	}
	return true;
}

void PrintPalindromesInText(char* Text)
{
	int Found = 0;
	
	while (*Text != '\0')
	{
		size_t TempLen = 0;
		char* Temp = Text;
		while (isalpha(*Temp))
		{
			*Temp++;
			TempLen++;
		}
		if (IsPalindrom(Text, TempLen))
		{
			puts("Found: ");
			for (size_t i = 0; i < TempLen; i++)
			{
				putchar(Text[i]);
			}
			putchar('\n');
			Found++;
		}
		Text += TempLen+1;
	}

	printf("Found %d Palindromes!\n", Found);
}

//aufzurufen z.b.:
PrintPalindromesInText("huhu test anna qwer alla butter reger abba cdddc");
kann man mit strtok noch verkürzen wenn man alle delimiter kennt, ich habs jetzt umgekehrt gemacht und nur das alphabet als gültige zeichen zugelassen.

EDIT:
hier die strtok version:
Code:
void PrintPalindromesInText(char* Text)
{
	int Found = 0;

	char* Buffer = new char[strlen(Text) + 1];
	strcpy(Buffer, Text);
	const char* Seperators = " ,.!?;\t\n";

	char* Token = strtok(Buffer, Seperators);
	
	while (Token)
	{
		if (IsPalindrom(Token, strlen(Token)))
		{
			printf("Found: %s\n", Token);
			Found++;
		}
		Token = strtok(NULL, Seperators);
	}

	printf("Found %d Palindromes!\n", Found);
}
anwendung genauso wie oben.

den string neu zu kopieren kann man sich sparen wenn man den text vorher in nem veränderbaren buffer hat und nicht als const string übergibt.
Also erstmal Danke dafür, jedoch muss ich das aus einer Textdatei ausführen (mit fopen undso) und da muss ich mit Arrays arbeiten um die Wörter aus der Textdatei herauszufiltern.
*-_JuLi²_-* is offline  
Old 10/16/2014, 19:53   #6
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
Quote:
Originally Posted by *-_JuLi²_-* View Post
Also erstmal Danke dafür, jedoch muss ich das aus einer Textdatei ausführen (mit fopen undso) und da muss ich mit Arrays arbeiten um die Wörter aus der Textdatei herauszufiltern.
du wirst es doch wohl hinkriegen den text aus der textdatei in ein char array zu laden und das dann PrintPalindromesInText zu übergeben, oder?
um festzustellen ob ein wort ein palindrom ist kannst du meine IsPalindrom benutzen, um den gesamttext in einzelne wörter zu unterteilen wie in PrintPalindromesInText gezeigt strtok benutzen.
Dr. Coxxy is offline  
Old 10/16/2014, 20:23   #7
 
*-_JuLi²_-*'s Avatar
 
elite*gold: 8
Join Date: Mar 2010
Posts: 4,272
Received Thanks: 1,053
Quote:
Originally Posted by Dr. Coxxy View Post
du wirst es doch wohl hinkriegen den text aus der textdatei in ein char array zu laden und das dann PrintPalindromesInText zu übergeben, oder?
um festzustellen ob ein wort ein palindrom ist kannst du meine IsPalindrom benutzen, um den gesamttext in einzelne wörter zu unterteilen wie in PrintPalindromesInText gezeigt strtok benutzen.
Ich hab bei meinem Algo das bis jetzt immer Wort für Wort gemacht und das ist so ziemlich das gleiche wie dein IsPalindrom, wenn ich mich nicht irre.

Ich brauch jedoch einen der das so schnell wie möglich macht, oder ist das so ziemlich das schnellste? In meiner Mainfunktion zählt der so lange bis er zu einem Leerzeichen kommt und geht dann ins IsPalindrom, wenn er das überprüft hat geht er wieder in die Hauptfunktion und macht so weiter.
Es geht bei diesem Programm um die schnelligkeit, geht das nicht irgendwie noch schneller?
*-_JuLi²_-* is offline  
Old 10/16/2014, 20:30   #8


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
Du willst also einfach eine copy&paste fertige Lösung? Dann bist du hier falsch.
MrSm!th is offline  
Old 10/16/2014, 20:34   #9
 
*-_JuLi²_-*'s Avatar
 
elite*gold: 8
Join Date: Mar 2010
Posts: 4,272
Received Thanks: 1,053
Quote:
Originally Posted by MrSm!th View Post
Du willst also einfach eine copy&paste fertige Lösung? Dann bist du hier falsch.
Nein, ich brauch einen möglichst schnellen Algorithmus der mir aus meiner Textdatei die Anzahl der Palindrome ausliest. Bin noch Anfänger.
*-_JuLi²_-* is offline  
Old 10/16/2014, 20:43   #10
 
Schlüsselbein's Avatar
 
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
Und warum brauchst du das?
Schlüsselbein is offline  
Old 10/16/2014, 20:48   #11
 
*-_JuLi²_-*'s Avatar
 
elite*gold: 8
Join Date: Mar 2010
Posts: 4,272
Received Thanks: 1,053
Quote:
Originally Posted by Schlüsselbein View Post
Und warum brauchst du das?
Rein aus Test bzw Lernzwecken. Da ich, wie gesagt, noch Anfänger bin und ich C lernen möchte hab ich mich heute mal rangesetzt und versucht einen möglichst schnellen Algorithmus für das herauszufinden. Ich suche lediglich einen schnelleren als meinen.

Hier mal mein Code:
Code:
while((text[i] = fgetc(fp)) != EOF)
	{
		if(text[i] == 32) 
		{
			if(palindrom(i,text) == 1)
			{
				zähler++;
			}
			i = -1;
		}
		i++;
	}
Code:
int palindrom(int i, char text[])
{
	int z = 0;
	i--;
	while(z <= i)
	{
		if(text[z] != text[i])
		{
			return 0;
		}
		i--;
		z++;
	}
	return 1;
}
*-_JuLi²_-* is offline  
Old 10/16/2014, 20:52   #12
 
Schlüsselbein's Avatar
 
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
Wenn du die Algorithmen vergleichen möchtest, solltest du den Text davor einlesen und dann messen - falls es die Größe der Datei zulässt.
Schlüsselbein is offline  
Old 10/16/2014, 20:55   #13
 
*-_JuLi²_-*'s Avatar
 
elite*gold: 8
Join Date: Mar 2010
Posts: 4,272
Received Thanks: 1,053
Quote:
Originally Posted by Schlüsselbein View Post
Wenn du die Algorithmen vergleichen möchtest, solltest du den Text davor einlesen und dann messen - falls es die Größe der Datei zulässt.
Eben nicht, ich hab mir eine fast 10MB große Textdatei erstellt mit Palindromen und normale Wörter. Ich messe die Zeit übrigens mit der clock() funktion.
*-_JuLi²_-* is offline  
Old 10/16/2014, 21:23   #14
 
Schlüsselbein's Avatar
 
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
Eine 10MB Datei wird bei mir im Bruchteil einer Sekunde eingelesen - von einer 0815 Festplatte, nicht von meiner SSD.
Also lese die Werte ein und zähle anschließend die Palindrome. Somit solltest du unverfälschte Ergebnisse bekommen.

Außerdem kein Zitat nötig, wenn du auf den Post über dir antwortest.
Schlüsselbein is offline  
Old 10/16/2014, 21:31   #15
 
*-_JuLi²_-*'s Avatar
 
elite*gold: 8
Join Date: Mar 2010
Posts: 4,272
Received Thanks: 1,053
Einlesen kann ich das auch aber wie kann ich 10MB Text in ein Array speichern?
*-_JuLi²_-* is offline  
Closed Thread


Similar Threads Similar Threads
Suche jemanden der in ICQ IP Adresse herausfindet und mit die Daten sagt
10/11/2012 - Trading - 10 Replies
Währe sowas möglich ?



All times are GMT +2. The time now is 19:05.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.