Datenstruktur_Probleme im Zusammenhang mit der Algorithmusimplementierungssequenztabelle_13

1. Problembeschreibung:

Entwerfen Sie bei einem Array mit n (n>=1) Ganzzahlen einen möglichst zeiteffizienten Algorithmus, um die kleinste positive Ganzzahl zu finden, die nicht im Array erscheint. Beispielsweise ist die kleinste positive Ganzzahl, die nicht im Array {-5, 3, 2, 3} erscheint, 1; die kleinste positive Ganzzahl, die nicht im Array {1, 2, 3} erscheint, ist 4. Die Anforderungen Sind:

  • Die grundlegenden Designideen des Algorithmus werden angegeben.
  • Je nach Entwurfsidee wird der Algorithmus in der Sprache C oder C++ beschrieben und zu wichtigen Punkten kommentiert.
  • Beschreiben Sie die zeitliche und räumliche Komplexität des von Ihnen entworfenen Algorithmus.

2. Algorithmisches Denken:

Da es zeitlich möglichst effizient sein muss, wird die Methode des Austauschs von Raum gegen Zeit übernommen. Ordnen Sie ein Array B[n] zur Markierung zu, um aufzuzeichnen, ob eine positive Ganzzahl von 1 bis n in A vorkommt. B[0] entspricht der positiven Ganzzahl 1 und B[n-1] entspricht der positiven Ganzzahl n. Initialisieren Sie B Alle sind 0. Da A n Ganzzahlen enthält, sind die möglichen Rückgabewerte 1 ~ n+1. Wenn die n Zahlen in A genau 1 ~ n sind, wird n+1 zurückgegeben. Wenn es eine Ganzzahl gibt, die kleiner oder gleich 0 oder größer ist als n in Array A. Wenn der Wert festgelegt ist, gibt es freie Positionen in 1 ~ n, und das zurückgegebene Ergebnis muss in 1 ~ n liegen. Wenn daher ein Wert kleiner oder gleich 0 oder größer als n erscheint A: Es können keine Maßnahmen ergriffen werden.

Nach der obigen Analyse können wir den Algorithmusablauf zeichnen: Beginnen Sie mit A[0] und durchlaufen Sie A. Wenn 0<A[i]<=n, dann sei B[A[i] - 1] = 1; andernfalls Es wird kein Vorgang ausgeführt. Beginnen Sie nach dem Durchlaufen von A mit dem Durchlaufen von Array B. Wenn Sie den ersten Index i finden, der B[i] == 0 erfüllt, geben Sie als Ergebnis i + 1 zurück. Dies gibt die kleinste positive ganze Zahl an, die nicht in A vorkommt. Zwischen 1 ~ n. Wenn alle B[i] nicht 0 sind, geben Sie i + 1 zurück (i = n, wenn Sie aus der Schleife springen, ist i + 1 gleich n + 1). Zu diesem Zeitpunkt bedeutet dies, dass dies die kleinste positive ganze Zahl ist, die dies nicht tut in A erscheinen ist n + 1.

3. Algorithmuscode:

int findMissMin(int A[],int n)
{
    
    
	int i,*B;//标记数组
	B = (int *)malloc(sizeof(int) * n);//分配空间
	memset(B,0,sizeof(int) * n);//赋初值为0
	for(i = 0;i < n;i++)
	{
    
    
		if(A[i] > 0 && A[i] <= n)//若A[i]的值介于1~n,则标记数组B
			B[A[i] - 1] = 1;
	}
	for(i = 0;i < n;i++)//扫描数组B,找到目标值
	{
    
    
		if(B[i] == 0)
			break;
	}
	return i + 1;//返回结果
}

4. Komplexität des Algorithmus:

  • Zeitkomplexität: A einmal durchqueren und B einmal durchqueren. Die Operationsschritte in den beiden Schleifen liegen in der Größenordnung von O (1), sodass die Zeitkomplexität O (n) beträgt.
  • Raumkomplexität: B[n] wird zusätzlich zugewiesen, und die Raumkomplexität beträgt O(n).

5. Erweitern Sie die Memset-Funktion:

Die C-Bibliotheksfunktion void *memset(void *str, int c, size_t n) kopiert das Zeichen c (ein vorzeichenloses Zeichen) in die ersten n Zeichen der Zeichenfolge, auf die der Parameter str zeigt.

Parameter:

  • str – Zeiger auf den zu füllenden Speicherblock.
  • c – der einzustellende Wert. Der Wert wird als int übergeben, aber die Funktion verwendet beim Füllen des Speicherblocks die vorzeichenlose Zeichenform des Werts.
  • n – Die Anzahl der Zeichen, die auf diesen Wert festgelegt werden sollen.

Rückgabewert:

  • Der Wert gibt einen Zeiger auf den Speicherbereich str zurück.

Wenn Memset ein Wert zugewiesen wird, kann ihm nur der Wert 0 zugewiesen werden?

  • Die Antwort lautet definitiv nicht. Beispielsweise ist jedes Zeichen akzeptabel und die Initialisierung auf 0 wird am häufigsten verwendet. Im Allgemeinen wird dem Typ int der Wert 0 oder -1 zugewiesen, und andere Werte sind nicht akzeptabel.

Acho que você gosta

Origin blog.csdn.net/qq_56866000/article/details/132036138
Recomendado
Clasificación