Einige Kenntnisse des Vorwettbewerbs

Präfix, Infix, Postfix (umgekehrter polnischer) Ausdruck

Infix-Ausdruck

中缀表达式是一个通用的算术或逻辑公式表示方法。其实中缀表达式跟我们平常见到的数学式子是一样的。

Zum Beispiel: 1 * (2 + 3)


Präfixausdruck
前缀表达式又称波兰表达式,,前缀表达式的运算符位于操作数之前

Zum Beispiel: - × + 3 4 5 6

Auswertung des Präfixausdrucks
从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果

Zum Beispiel: - × + 3 4 5 6

  1. Scannen Sie von rechts nach links und schieben Sie 6, 5, 4, 3 auf den Stapel
  2. Treffen Sie auf den Operator +, also Pop 3 und 4 (3 ist das oberste Element auf dem Stapel, 4 ist das nächste oberste Element, achten Sie auf den Vergleich mit dem Suffix-Ausdruck), berechnen Sie den Wert von 3 + 4, erhalten Sie 7 und schieben Sie dann 7 in den Stapel
  3. Als nächstes kommt der × -Operator. Pop 7 und 5, berechnen 7 × 5 = 35 und legen 35 auf den Stapel
  4. Schließlich ist der Operator, der den Wert von 35-6 berechnet, was 29 ist, und somit das Endergebnis

Infix-Ausdruck zum Präfix-Ausdruck

Methode:
Wir richten zwei Stapeltabellen ein, s1 und s2.
Durchlaufen Sie den Infix-Ausdruck von rechts nach links .
Wenn Sie auf eine Zahl stoßen, drücken Sie sie in s1.
Wenn Sie auf einen Operator (s2) stoßen:

  1. Wenn der Stapel leer ist oder das Symbol oben auf dem Stapel ')' lautet, drücken Sie direkt in s2
  2. Wenn die Priorität des Operators am oberen Rand des Stapels kleiner oder gleich dem aktuellen Symbol ist, wird er direkt in s2 gedrückt
  3. Andernfalls platzieren Sie den Top-Operator in s2, drücken Sie s1 und gehen Sie erneut zu (4-1), um ihn mit dem neuen Top-Operator in s1 zu vergleichen

Wenn Sie auf Klammern stoßen

  1. Wenn es sich um die richtige Klammer ")" handelt, drücken Sie s1 direkt
  2. Wenn es sich um die linke Klammer "(" handelt, werden die Operatoren am oberen Rand des S1-Stapels der Reihe nach eingeblendet und S2 wird gedrückt, bis die rechte Klammer gefunden wird. Zu diesem Zeitpunkt wird das Klammerpaar verworfen

Wiederholen Sie die Schritte 2 bis 5 bis zum äußersten linken Teil des Ausdrucks.
Öffnen Sie die verbleibenden Operatoren in s1 und verschieben Sie sie in s2
. Öffnen Sie die Elemente in s2 und geben Sie sie aus. Das Ergebnis ist der Präfixausdruck, der dem Infix-Ausdruck entspricht.

Fügen Sie hier eine Bildbeschreibung ein


Postfix-Ausdruck
后缀表达式又称逆波兰表达式,与前缀表达式相似,只是运算符位于操作数之后

Zum Beispiel: 3 4 + 5 × 6-

Auswertung des Postfix-Ausdrucks
从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果

Wie Präfix, daher werde ich hier kein Beispiel machen

Infix-Ausdruck zum Postfix-Ausdruck

Methode:
Wir richten zwei Stapeltabellen ein, s1 s2.
Durchlaufen Sie den Infix-Ausdruck von links nach rechts .
Wenn Sie auf eine Zahl stoßen, drücken Sie sie in s1.
Wenn Sie auf einen Operator (s2) stoßen:

  1. Wenn der Stapel leer ist oder das Symbol oben auf dem Stapel '(' ist, schieben Sie ihn direkt in s2
  2. Wenn die Priorität des Operators am oberen Rand des Stapels kleiner oder gleich dem aktuellen Symbol ist, wird er direkt in s2 gedrückt
  3. Andernfalls platzieren Sie den Top-Operator in s2, drücken Sie s1 und gehen Sie erneut zu (4-1), um ihn mit dem neuen Top-Operator in s1 zu vergleichen

Wenn Sie auf Klammern stoßen

  1. Wenn es sich um die linke Klammer "(" handelt, drücken Sie direkt s1
  2. Wenn es sich um die rechte Klammer ")" handelt, werden die Operatoren am oberen Rand des S1-Stapels nacheinander eingeblendet und S2 wird gedrückt, bis die linke Klammer gefunden wird, und dieses Klammerpaar wird verworfen

Wiederholen Sie die Schritte 2 bis 5 bis zum äußersten linken Teil des Ausdrucks.
Öffnen Sie die verbleibenden Operatoren in s1 und verschieben Sie sie
nacheinander in s2 , um die Elemente in s2 und die Ausgabe anzuzeigen. Das Ergebnis ist der Suffix-Ausdruck, der dem Infix-Ausdruck entspricht (in Suffix konvertiert) Verwenden Sie beim Ausdrücken keine umgekehrte Reihenfolge.)

Fügen Sie hier eine Bildbeschreibung ein

Einige Kenntnisse des NOIP-Wettbewerbs

Die vom Wettbewerb empfohlenen Wettbewerbssprachen sind:
C ++ und C-
frei Pascal
Lazarus
Pascal
gcc / g ++
Dev C ++

Nicht empfohlen:
TP7 (Turbo Pascal 7)
TC (Turbo C)
Visual C ++

Programmierregeln:

  1. Für jede Testfrage sollte der Teilnehmer nur eine Quelldatei einreichen. Der Name der Quellprogrammdatei besteht aus der Abkürzung des Namens der Testfrage plus einem Suffix, und der Name und das Suffix der Quellprogrammdatei sind alle in Kleinbuchstaben. Die Suffixe für PASCAL-, C- und C ++ - Programme sind .pas, .c bzw. .cpp. Wenn ein Teilnehmer mehrere Quellprogrammdateien mit unterschiedlichen Suffixen für eine Testfrage einreicht, wählt das Testsystem die erste vorhandene Datei in der Reihenfolge .c, .cpp, .pas zum Kompilieren und Auswerten aus und ignoriert andere Dateien.
  2. Diejenigen, die die Sprache C / C ++ verwenden, dürfen keine eigenen Header-Dateien verwenden, und diejenigen, die die Sprache Pascal verwenden, dürfen keine eigenen Bibliothekseinheiten verwenden. Sofern nicht anders angegeben, darf die Quelldatei jedes Frageneingabeprogramms nicht größer als 100 KB sein. Wenn der Teilnehmer andere Unterverzeichnisse unter dem angegebenen Verzeichnis erstellt, werden die Dateien in diesen Unterverzeichnissen vom Bewertungssystem ignoriert.
  3. Das Teilnehmerprogramm sollte normal enden und zum Linux-System zurückkehren, und der Rückgabewert der Hauptfunktion muss 0 sein.
  4. Das Programm des Teilnehmers darf nur auf eine Weise mit der externen Umgebung kommunizieren, die im Betreff klar festgelegt ist, z. B. Lesen und Schreiben in die angegebene Datei und Aufrufen der angegebenen Bibliotheksfunktion. Die folgenden Operationen sind im Programm strengstens verboten:
  • Versuch, auf das Netzwerk zuzugreifen
  • Verwenden Sie Fork-, Exec-, System- oder andere Thread- / Prozessgenerierungsfunktionen
  • Öffnen oder erstellen Sie andere Dateien und Verzeichnisse als die im Titel angegebenen Eingabe- / Ausgabedateien
  • Führen Sie andere Programme aus
  • Ändern Sie die Zugriffsberechtigungen für das Dateisystem
  • Lesen und Schreiben von Informationen zur Dateisystemverwaltung
  • Verwenden Sie neben dem Lesen und Schreiben bestimmter Eingabe- / Ausgabedateien auch andere Systemaufrufe
  • Erfassen und verarbeiten Sie Maus- und Tastatureingabemeldungen
  • Lesen und Schreiben von Computer-Eingangs- / Ausgangsanschlüssen
  1. Sofern im Titel nicht anders angegeben, darf der gesamte statische und dynamische Speicherplatz, der im Teilnehmerprogramm verwendet wird, nicht überschritten werden128 MB

Einschränkungen für C-Programme
Programme verbieten die Verwendung integrierter Assembly- und Bibliotheksfunktionen oder Makros, die mit einem Unterstrich beginnen (außer bei selbst definierten).
Nur die folgenden Header-Dateien können im Programm verwendet werden und werden indirekt von ihnen aufgenommen: assert.h, ctype.h, errno.h, float.h, limit.h, math.h, stdio.h, stdlib.h, string .h, time.h.
64-Bit-Ganzzahlen können nur lange lange und vorzeichenlose lange lange Typen verwenden.

Einschränkungen für C ++ - Programme
Programme verbieten die Verwendung von Inline-Assembly- und Bibliotheksfunktionen oder Makros, die mit einem Unterstrich beginnen (mit Ausnahme von selbst definierten).
64-Bit-Ganzzahlen können nur lange lange und vorzeichenlose lange lange Typen verwenden.
Sie können Vorlagen in STL verwenden.
Einschränkungen für Pascal-Programme
Programme verbieten die Verwendung von Inline-Assemblys und die Verwendung von Kompilierungsschaltern.
Es ist verboten, andere Einheiten im Programm zu verwenden, außer der Systembibliothek (automatisches Laden) und der Mathematikbibliothek (es muss eine Mathematikklausel verwendet werden).

Alle Programme, die die oben genannten Anforderungen erfüllen und unter der im Titel angegebenen Befehlszeile kompiliert werden können, sind legale Quellprogramme. Aber selbst wenn das Quellprogramm legal ist, wird es als Verstoß gewertet, solange es während der Ausführung des Programms Verstöße gibt.

Zusammenfassung verschiedener Sortieralgorithmen

Vergleichssortierung und nicht vergleichende Sortierung
Übliche Sortieralgorithmen sind die Vergleichssortierung. Die nicht vergleichende Sortierung umfasst die Zählsortierung, die Bucket-Sortierung und die Kardinalsortierung. Die nicht vergleichende Sortierung stellt Anforderungen an Daten, da die Daten selbst Positionierungsfunktionen enthalten, sodass alle ohne Vergleich durchgeführt werden können. Bestimmen Sie die Position des Elements.
Die zeitliche Komplexität der Vergleichssortierung beträgt normalerweise O ( n 2 n ^ 2n2 ) oder O (n log ⁡ nn \ log_nnlo gn) ist die Untergrenze der zeitlichen Komplexität der Vergleichssortierung O ( n / lognn / log_nn / l o gn), anstatt die zeitliche Komplexität der Sortierung zu vergleichen, kann O ( nn) erreicht werdenn ), aber alle benötigen zusätzlichen Platz.
Die zeitliche Komplexität der Vergleichssortierung beträgt O (n log ⁡ nn \ log_nnlo gn) 'S Beweis:
a1, a2, a3 ...... alle Folgen von a haben n! N!n ! Spezies, also hat die erforderliche Reihenfolge a1 ', a2', a3 '... an' (wobei a1 '<= a2' <= a3 '... <= an') eine Wahrscheinlichkeit von1 / n! 1 / n !1 / die n- ! . Basierend auf dem Vergleich und der Sortierung der Eingabeelemente ist die Rückgabe jedes Vergleichs entweder 0 oder 1, was zufällig eine Entscheidung des Entscheidungsbaums ist, ein Ereignis in zwei Zweige zu unterteilen. Durch Vergleichen der Größe der beiden Zahlen a1 und a2 bei der Blasensortierung kann die Sequenz beispielsweise in zwei verschiedene Ergebnisse unterteilt werden: a1, a2 ... an und a2, a1 ... an (Blase a2 steigt um eine Position), sodass auch die Vergleichssortierung erfolgt Ein Entscheidungsbaum kann erstellt werden. Der Wurzelknoten repräsentiert die ursprüngliche Sequenz a1, a2, a3 ... an, alle Blattknoten sind Umlagerungen dieser Sequenz (insgesamt n!, Von denen einer das Ergebnis unserer Sortierung a1 ', a2', a3 '... an' ist. ). Wenn das Ergebnis jedes Vergleichs die gleiche Wahrscheinlichkeit ist (es wird zufällig in zwei Ereignisse mit gleichem Wahrscheinlichkeitsraum unterteilt), ist der Binärbaum mit einer Tiefe von mindestenslog ⁡ n! \ Log_ {n!}Sehr ausgeglichen.lo gn !.
Und weil 1. n! <Nn, log (n!) <Nlog (n) erhalten wird, indem der Logarithmus auf beiden Seiten genommen wird, log log ⁡ n! \ Log_ {n!}lo gn != O ( n log ⁡ nn \ log_nnlo gn).
2. n! = N (n-1) (n-2) (n-3)… 1> (n / 2) ^ (n / 2) Nehmen Sie den Logarithmus beider Seiten, um log ⁡ n! \ Log_ {n zu erhalten !}lo gn !> (n / 2) $ \ log_ {n / 2} $ = Ω \ OmegaΩ (n log ⁡ nn \ log_nnlo gn), also log ⁡ n! \ Log_ {n!}lo gn != Ω \ OmegaΩ (n log ⁡ nn \ log_nnlo gn).
Deshalb log ⁡ n! \ Log_ {n!}lo gn !Die Wachstumsrate von n log ⁡ nn \ log_nnlo gnGleich, d. H. Log (n!) = & Thgr; \ Thetaθ (nlogn) ist dies die minimale Zeitkomplexität des allgemeinen Sortieralgorithmus O (n log ⁡ nn \ log_n)nlo gn) Basis.

排序的稳定性和复杂度

  不稳定:

  选择排序(selection sort)— O(n^2)

  快速排序(quicksort)— O(nlogn) 平均时间, O(n^2) 最坏情况(要找的数在最左最右端); 
  对于大的、乱序串列一般认为是最快的已知排序

  堆排序 (heapsort)— O(nlogn)

  希尔排序 (shell sort)— O(nlogn)

  基数排序(radix sort)— O(n*k); 需要 O(n) 额外存储空间 (K为特征个数)



  稳定:

  插入排序(insertion sort)— O(n2)

  冒泡排序(bubble sort) — O(n2)

  归并排序 (merge sort)— O(n log n); 需要 O(n) 额外存储空间

  二叉树排序(Binary tree sort) — O(nlogn); 需要 O(n) 额外存储空间

  计数排序  (counting sort) — O(n+k); 需要 O(n+k) 额外存储空间,k为序列中Max-Min+1

  桶排序 (bucket sort)— O(n); 需要 O(k) 额外存储空间

So konvertieren Sie einen Baum in einen Binärbaum

Antworten:

  1. Setzen Sie das Kind an den aktuellen Punkt im linken Teilbaum.
  2. Platzieren Sie das Geschwister des aktuellen Punkts im rechten Teilbaum.

Nachdem der Jiang Yi-Baum in einen Binärbaum konvertiert wurde, hat der Wurzelknoten keinen richtigen Teilbaum
Immerhin hat der Wurzelknoten keine Brüder!

Nehmen Sie eine Beispielfrage
Fügen Sie hier eine Bildbeschreibung ein
als Beispiel: Die Antwort lautet: So
Fügen Sie hier eine Bildbeschreibung ein
einfach ist das

Aktualisierung ...
Zusammenfassung der LTH-Vorrunde Zusammenfassung der
WHDTXDY-Vorrunde

Ich denke du magst

Origin blog.csdn.net/bigwinner888/article/details/108670902
Empfohlen
Rangfolge