feuervogel
02.02.2006, 02:07:41
hallihallo!
wer nicht weiß, was die überschrift bedeutet, lese hier:
http://de.wikipedia.org/wiki/Cantorsche_Paarungsfunktion
oder meine erklärung: es geht darum einem paar von zahlen eine zahl zuzuordnen. der trick dabei ist, dass diese zahl eindeutig ist, also kein unterschiedliches zahlenpaar hat genau die gleiche zugeordnete zahl. (0,1) und (1,0) sind z.b. unterschiedlich, weil die reihenfolge auch eine rolle spielt.
man kann zudem auch von dieser zahl auf das paar zurückschließen.
dadurch kann man in einer matrix die werte nicht mehr mit $m[ $zeile ][ $spalte] oder so speichern, sondern eleganter, in dem man nur noch ein eindimensionales array hat.
dazu habe ich folgende klasse geschrieben und denke, sie wird einigen menschen nützlich sein (achtung, ist PHP5):
class Cantor {
public function compute( $x , $y ) {
return 0.5 * ($x + $y) * ($x + $y + 1) + $y;
}
public function computeX( $z ) {
$j = floor( -0.5 + sqrt( 0.25 + 2 * $z ) );
return $j - $this->computeY( $z );
}
public function computeY( $z ) {
$j = floor( -0.5 + sqrt( 0.25 + 2 * $z ) );
return $z - $this->f( $j );
}
private function f( $w ) {
return 0.5 * $w * ($w + 1);
}
}
so. weil ich für so nen schnickschnack nicht rechenzeit verschwenden will, sollte das schnell gehen. ich habe die in meinen augen schnellste version geschrieben, die möglich ist...oder? findet jemand eine schnellere? die genauen regeln zur berechnung finden sich im wikipedia-artikel (s.o.)
zum testen:
$c = new Cantor();
for( $i = 0; $i < 1000; $i++ ) {
for( $j = 0; $j < 1000; $j ++ ) {
$e = $c->compute( $i , $j );
$x = $c->computeX( $e );
$y = $c->computeY( $e );
}
}
braucht auf meinem system unter 17 sekunden. amd 2400+ mit 512 mb ram, also nichts berauschendes. würde mich freuen, wenn jemand eine bessere lösung findet.
ansonsten: macht damit, was ihr wollt, ich werds morgen dokumentieren, bin jetzt zu müde...
wer nicht weiß, was die überschrift bedeutet, lese hier:
http://de.wikipedia.org/wiki/Cantorsche_Paarungsfunktion
oder meine erklärung: es geht darum einem paar von zahlen eine zahl zuzuordnen. der trick dabei ist, dass diese zahl eindeutig ist, also kein unterschiedliches zahlenpaar hat genau die gleiche zugeordnete zahl. (0,1) und (1,0) sind z.b. unterschiedlich, weil die reihenfolge auch eine rolle spielt.
man kann zudem auch von dieser zahl auf das paar zurückschließen.
dadurch kann man in einer matrix die werte nicht mehr mit $m[ $zeile ][ $spalte] oder so speichern, sondern eleganter, in dem man nur noch ein eindimensionales array hat.
dazu habe ich folgende klasse geschrieben und denke, sie wird einigen menschen nützlich sein (achtung, ist PHP5):
class Cantor {
public function compute( $x , $y ) {
return 0.5 * ($x + $y) * ($x + $y + 1) + $y;
}
public function computeX( $z ) {
$j = floor( -0.5 + sqrt( 0.25 + 2 * $z ) );
return $j - $this->computeY( $z );
}
public function computeY( $z ) {
$j = floor( -0.5 + sqrt( 0.25 + 2 * $z ) );
return $z - $this->f( $j );
}
private function f( $w ) {
return 0.5 * $w * ($w + 1);
}
}
so. weil ich für so nen schnickschnack nicht rechenzeit verschwenden will, sollte das schnell gehen. ich habe die in meinen augen schnellste version geschrieben, die möglich ist...oder? findet jemand eine schnellere? die genauen regeln zur berechnung finden sich im wikipedia-artikel (s.o.)
zum testen:
$c = new Cantor();
for( $i = 0; $i < 1000; $i++ ) {
for( $j = 0; $j < 1000; $j ++ ) {
$e = $c->compute( $i , $j );
$x = $c->computeX( $e );
$y = $c->computeY( $e );
}
}
braucht auf meinem system unter 17 sekunden. amd 2400+ mit 512 mb ram, also nichts berauschendes. würde mich freuen, wenn jemand eine bessere lösung findet.
ansonsten: macht damit, was ihr wollt, ich werds morgen dokumentieren, bin jetzt zu müde...