Gegeben Einträge nehme ich einheitlich ab ersatzlose Einträge darunter.
Meine Frage ist, dass ich möchte, dass ein sehr schneller Algorithmus solche Dinge tut, und wie hoch ist seine zeitliche Komplexität? Ist die Konstante in der Zeitkomplexität groß?
Ich bin sicher, Ihre Frage wurde gründlich recherchiert und veröffentlicht (haben Sie sie gegoogelt?). Ich persönlich habe nicht genau das benötigt, wonach Sie fragen, aber ich habe zufällige Permutationen von benötigt , für die ich die folgende kleine Funktion geschrieben habe, basierend auf dem Googeln des Algorithmus, den sie implementiert ...
#include <stdio.h>
#include <stdlib.h>
/* ==========================================================================
* Function: int permutation ( int seed, int n, int *p )
* Purpose: Returns p[0]...p[n-1] containing 1...n arranged randomly
* --------------------------------------------------------------------------
* Arguments: seed (I) int optionally containing seed for srandom(),
* if 0 or negative, srandom() not called
* n (I) int containing rank of permutation
* p (O) &int returning 1...n arranged randomly
* Returns: ( int ) n=success, 0=failure
* --------------------------------------------------------------------------
* Notes: o
* ======================================================================= */
/* --- entry point --- */
int permutation ( int seed, int n, int *p ) {
/* --- Allocations and Declarations --- */
int i=0; /* p[] index */
/* --- Initialization --- */
if ( n<1 || p==NULL ) { n=0; goto end_of_job; } /* input error */
if ( seed > 0 ) srandom(seed); /* initialize random() */
for ( i=0; i<n; i++ ) p[i] = i+1; /* initialize p[0...n-1] = 1...n */
/* ---
* Generate random permutation
* ------------------------------ */
for ( i=0; i<n-1; i++ ) {
int j = i + ((random())%(n-i)); /* random i <= j <= n-1 */
int pi = p[i]; /* swap p[i] <--> p[j] */
p[i] = p[j]; /* p[i] = p[j] */
p[j] = pi; } /* p[j] = p[i] */
end_of_job:
return ( n ); /* back to caller */
} /* --- end-of-function permutation() --- */
/* ---
* Test Driver
* -------------- */
#if defined(TESTDRIVE)
int main ( int argc, char *argv[] ) {
int n = (argc>1? atoi(argv[1]) : 16 ), /* rank of permutation */
seed = (argc>2? atoi(argv[2]) : 7654321 ); /* srandom() seed */
int permutation(), p[9999], /* random permutation of 1...n */
i=0; /* p[] index */
if(n<0)n=16; if(n>999)n=999; /* sanity check */
permutation(seed,n,p); /* generate permutation */
for ( i=0; i<n; i++ ) /* print results */
printf("%5d%s",p[i],((i+1)%10==0||i==n-1?"\n":", "));
} /* --- end-of-function main() --- */
#endif
Nun, ich denke, Sie würden nur das erste wollen Eintragungen, Einnahme wie Ihre Stichprobe ersatzlos. Und in diesem Fall, denke ich, könnten Sie die Schleife einfach anhalten (statt bei für die gesamte Permutation). Und dann ist die Komplexität eindeutig nur linear , was meiner Meinung nach so gut ist, wie Sie es sich erhoffen können.
Raum istdunkelgrün
John Forkosh