1. Problembeschreibung:
Angenommen, n (n>1) ganze Zahlen werden in einem eindimensionalen Array R gespeichert. Entwerfen Sie einen Algorithmus, der sowohl zeitlich als auch räumlich möglichst effizient ist. Verschieben Sie die in R gespeicherte Sequenz kreisförmig um p (0<p<n) Positionen nach links, d. h. transformieren Sie die Daten in R von (X0, X1,..., Xn-1) nach (Xp, Xp+1). ,... ,Xn-1,X0,X1,...,Xp-1). Erfordern:
- Die grundlegenden Designideen des Algorithmus werden angegeben.
- Je nach Entwurfsidee wird der Algorithmus in der Sprache C, C++ oder Java beschrieben und zu wichtigen Punkten kommentiert.
- Beschreiben Sie die zeitliche und räumliche Komplexität des von Ihnen entworfenen Algorithmus.
2. Algorithmisches Denken:
Das Problem kann als Konvertierung des Arrays ab in das Array ba angesehen werden (a stellt die ersten p Elemente des Arrays dar, b stellt die verbleibenden n-p Elemente im Array dar). Zuerst wird a invertiert, um a zu erhalten< a i=1>-1b, und dann b umkehren, um a-1b< a i=5>-1 und schließlich das gesamte a-1b -1 wird invertiert, um (a-1b zu erhalten -1 = ba. Nehmen Sie an, dass die Reverse-Funktion die Operation zum Invertieren des Arrays ausführt und der Vorgang des Verschiebens von abcdefgh 3 (p=3) Positionen kreisförmig nach links wie folgt abläuft:-1)
- Reverae(0,p-1) erhält cbadefgh;
- Reverae(p,n-1)getcbahgfed;
- Reverae(0,n-1) erhält defghabc;
3. Algorithmuscode:
void Reverse(int R[],int from,int to)
{
int i,temp;
for(i = 0;i < (to - from + 1) / 2;i++)
{
temp = R[from + i];
R[from + i] = R[to - i];
R[to - i] = temp;
}
}
void Converse(int R[],int n,int p)
{
Reverse(R,0,p-1);
Reverse(R,p,n-1);
Reverse(R,0,n-1);
}
4. Komplexität des Algorithmus:
Die zeitliche Komplexität der drei Umkehrfunktionen beträgt O(p/2), O(n-p) bzw. O(n/2), sodass die zeitliche Komplexität des entworfenen Algorithmus O(n) und die räumliche Komplexität O( 1) beträgt ).