Sprechen wir darüber, warum ich das zuerst geschrieben habe. Als ich zum Interview ging, ging ich am Tag vor dem Interview in Alibabas ausgewiesener Interviewstadt und fand ein Hotel und blieb gegen 1 Uhr. , was direkt zu den schlechten Ergebnissen des Interviews am nächsten Tag führte (für große Garnelen, die einen Job suchen, sollte nicht eine Tragödie für die Garnelen sagen. Es ist immer noch sehr wichtig, sich im Voraus vorzubereiten). Eine Stunde (als ich aus dem Interview zurückkam, schlief ich fast, als ich ging, traurig !!) Als das Interview kurz vor dem Ende war, stellte mir der Interviewer die Frage nach der Fibonacci -Sequenz. Und ich wusste nur, dass ich drei Variablen mit der Liste initialisieren musste Ende kann ich die folgende erste Methode unter der schrittweisen Einführung des Interviewers schreiben. Goldene Periode für Reform und Goldabbau (Sie können schnell gehen, wenn Sie die Fähigkeit haben). Mit Müll kann Alibaba für die Datenanalyse die verschiedenen detaillierten Daten analysieren, die sie gemeistert haben, und den Geschmack und die Bedürfnisse der Benutzer besser lokalisieren und besser für einen genauen Push und einen genauen Werbedruck bieten. Wenn Tencents zukünftiger Traum das Wasser, Strom und Gas im Leben der Benutzer sein soll, dann ist Alibabas möglicher zukünftiger Traum die Lebensmittel, Kleidung, Wohnung und Transport des Benutzers sowie die Sammlung des Benutzers usw. O (∩_∩) O ~ Wenden wir uns an das Thema.
Für hervorragende Algorithmus -Designer gibt es nur zwei Dinge, die sich auf der Grundlage der Implementierung der Programmfunktionsbehörde kümmern müssen: Eine ist die zeitliche Komplexität des Entwurfsalgorithmus, und der andere ist die Raumkomplexität (um es unverblümt auszudrücken, ist es Die Zeit und der Speicher, der ein Programm ausführt, und die von ihm besetzte Speicherung. Anforderungen, im Allgemeinen Austausch von Raumressourcen für Zeit oder häufig verwendete Objekte im Gedächtnis, um die Reaktionszeit zu verbessern (Caching -Technologie und die meisten der beliebtesten NoSQL -Datenbanken werden für eingebettete Systeme mit relativ wertvollen Speicherressourcen verwendet, und die Zeit wird im Allgemeinen verwendet. für eingebettete Systeme.
Sprechen wir über die drei Implementierungen der Febonasi -Serie.
Lassen Sie uns zunächst über die Febonasi -Sequenz sprechen:
Aus textlicher Sicht beginnt die Fibonacci -Sequenz mit 0 und 1, und der nachfolgende Fibonacci -Koeffizient wird durch die beiden vorherigen Zahlen hinzugefügt, und die Sequenzform lautet wie folgt:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946 , ……………………
In der Mathematik wird es durch rekursive Methoden definiert:
F_0 = 0
F_1 = 1
F_n = f_ {n-1}+ f_ {n-2}
Implementieren Sie die Anforderung: Geben Sie die Seriennummer N ein und kehren Sie zurück, um die entsprechende Fonbonacci -Nummer zu erhalten
Programmimplementierung 1 - Funktionsförderung
Die Codekopie lautet wie folgt:
/**
* Funktionsförderung
* @Title: fntype1
* @Description: Todo
* @param @param n
* @param @return
* @return int
* @throws Ausnahme
*/
public int fntype1 (int n) löst Ausnahme {aus {
if (n == 0) {
Rückkehr 0;
} else if (n == 1 || n == 2) {
Rückkehr 1;
} else if (n> 2) {
int temp = fntype1 (n-1)+fntype1 (n-2);
if (temp <0) {
Neue Ausnahme auslegen ("Ungültiger Wert für den int typen, zu groß");
}anders{
Temperatur zurückgeben;
}
}anders{
Neue Ausnahme auslegen ("IllegalArgument Value für n, bitte geben Sie n> = 0");
}
}
Nachteile dieser Methode: Eine große Anzahl von Iterationen verbraucht kontinuierlich einen Stapelraum (diejenigen, die sich mit Webentwicklung, Debugging und Wartung befassen, sollten den Wert von Server -Stapel -Ressourcen kennen Lange Zeit, was zum Absturz des Webservers führt). Auftreten ist schwierig.
Programmimplementierung 2 - Zeit bis Raum
Die Codekopie lautet wie folgt:
/**
* Zeit, den Platz zu ändern
* @Title: fntype2
* @Description: Todo
* @param @param n
* @param @return
* @return int (n <0 return -1, jenseits der max. Int Größe Return -2)
* @throws
*/
public int fntype2 (int n) {
int result = -1;
int temp1 = 0;
int temp2 = 1;
für (int index = 0; index <= n; index ++) {
if (index == 0) {
Ergebnis = temp1;
} else if (index == 1) {
Ergebnis = temp2;
}anders{
Ergebnis = temp1+temp2;
if (Ergebnis <0) {
Ergebnis = -2;
brechen;
}
temp1 = temp2;
temp2 = Ergebnis;
}
}
Rückgabeergebnis;
}
Diese Methode wird hauptsächlich in Szenario 1 verwendet: Für Szenarien, in denen Objekte oder Variablen seltener verwendet werden und nach Verwendung nicht erneut verwendet werden. . Diese Methode wird oft im Design verwendet;
Programmimplementierung 3 - Raum für Zeit
Die Codekopie lautet wie folgt:
private statische Liste <Gefeger> fndata = new ArrayList <Ganzzahl> ();
private statische endgültige int maxSize = 50000;
/**
* Initialisierer
* @Title: setfndata
* @Description: Todo
* @param
* @return void
* @throws
*/
private static void setfndata () {
int result = -1;
int temp1 = 0;
int temp2 = 1;
für (int index = 0; index <= maxSize; Index ++) {
if (index == 0) {
Ergebnis = temp1;
} else if (index == 1) {
Ergebnis = temp2;
}anders{
Ergebnis = temp1+temp2;
if (Ergebnis <0) {
Ergebnis = -2;
brechen;
}
temp1 = temp2;
temp2 = Ergebnis;
}
fndata.add (Ergebnis);
}
}
/**
* Externe Schnittstelle
* @Title: getfndata
* @Description: Todo
* @param @param n
* @param @return
* @return int <span style = "Schriftfamilie: sans-serif;"> (n jenseits von fndata.size () und n <0 return -1) </span>
* @throws
*/
public int getfndata (int n) {
if (fndata.size () == 0) {
setfndata ();
}
if (fndata.size ()> n && n> = 0) {
return fndata.get (n);
}anders{
Return -1;
}
}
Diese Methode wird im Allgemeinen in Szenarien verwendet, in denen Objekte oder Variablen im gesamten Lebenszyklus des Programms vorhanden sind oder häufig aufgerufen werden, z.
Testfälle:
Die Codekopie lautet wie folgt:
Paket com.dbc.yangg.swing.test;
Import Java.util.ArrayList;
importieren java.util.list;
/**
* Geben Sie die Sequenznummer N ein und kehren Sie zurück, um die entsprechende Febonacci -Nummer zu erhalten
* @ClassName: init
* @Description: Todo
* @Author [email protected]
* @date 10. Januar 2014 um 19:52:13 Uhr
*
*/
öffentliche Klasse init {
/**
* Funktionsförderung
* @Title: fntype1
* @Description: Todo
* @param @param n
* @param @return
* @return int
* @throws Ausnahme
*/
public int fntype1 (int n) löst Ausnahme {aus {
if (n == 0) {
Rückkehr 0;
} else if (n == 1 || n == 2) {
Rückkehr 1;
} else if (n> 2) {
int temp = fntype1 (n-1)+fntype1 (n-2);
if (temp <0) {
Neue Ausnahme auslegen ("Ungültiger Wert für den int typen, zu groß");
}anders{
Temperatur zurückgeben;
}
}anders{
Neue Ausnahme auslegen ("IllegalArgument Value für n, bitte geben Sie n> = 0");
}
}
/**
* Zeit, den Platz zu ändern
* @Title: fntype2
* @Description: Todo
* @param @param n
* @param @return
* @return int (n <0 return -1, jenseits der max. Int Größe Return -2)
* @throws
*/
public int fntype2 (int n) {
int result = -1;
int temp1 = 0;
int temp2 = 1;
für (int index = 0; index <= n; index ++) {
if (index == 0) {
Ergebnis = temp1;
} else if (index == 1) {
Ergebnis = temp2;
}anders{
Ergebnis = temp1+temp2;
if (Ergebnis <0) {
Ergebnis = -2;
brechen;
}
temp1 = temp2;
temp2 = Ergebnis;
}
}
Rückgabeergebnis;
}
private statische Liste <Gefeger> fndata = new ArrayList <Ganzzahl> ();
private statische endgültige int maxSize = 50000;
/**
* Raum, um die Zeit zu ändern
* @Title: setfndata
* @Description: Todo
* @param
* @return void
* @throws
*/
private static void setfndata () {
int result = -1;
int temp1 = 0;
int temp2 = 1;
für (int index = 0; index <= maxSize; Index ++) {
if (index == 0) {
Ergebnis = temp1;
} else if (index == 1) {
Ergebnis = temp2;
}anders{
Ergebnis = temp1+temp2;
if (Ergebnis <0) {
Ergebnis = -2;
brechen;
}
temp1 = temp2;
temp2 = Ergebnis;
}
fndata.add (Ergebnis);
}
}
/**
*
* @Title: getfndata
* @Description: Todo
* @param @param n
* @param @return
* @return int (n jenseits von fndata.size () und n <0 return -1)
* @throws
*/
public int getfndata (int n) {
if (fndata.size () == 0) {
setfndata ();
}
if (fndata.size ()> n && n> = 0) {
return fndata.get (n);
}anders{
Return -1;
}
}
/**
*
* @Title: main
* @Description: Todo
* @param @param argv
* @return void
* @throws
*/
public static void main (String [] argv) {
Init init = new init ();
int n = 46;
versuchen {
System.out.println ("Typ1 ="+init.fntype1 (n));
} catch (Ausnahme e) {
// todo automatisch generierter Fangblock
System.out.println (e.getMessage ());
}
System.out.println ("Typ2 ="+init.fnType2 (n));
System.out.println ("type3 ="+init.getfndata (n));
}
}
Ausgangsergebnis:
Die Codekopie lautet wie folgt:
Typ1 = 1836311903
Typ2 = 1836311903
Typ3 = 1836311903
Beim Entwerfen von Algorithmen sind Konzepte nicht blind.
Lassen Sie mich beschweren: Ich persönlich glaube, dass ein hervorragendes Design der Datenstruktur die Komplexität des Algorithmus -Designs vereinfachen und die Lesbarkeit der Code, die Skalierbarkeit und die Ausführungseffizienz verbessern kann.
Lassen Sie mich erneut beschweren: Drei Prinzipien sollten bei der Analyse der Nachfrage befolgt werden: 1. Analyse aus der Sicht des Benutzers und Denkweise; Die Prinzipien der Programmentwicklung sind: aktiv den eigenen Geschmack verbessern und Funktionen aus der Nutzungsperspektive und der Nutzungsszenarien des Benutzers analysieren. IS und in welcher Situation wird der Benutzer folgendermaßen aufgerufen, welche Ausnahmen durch Übergabe von Parametern verursacht werden können, welche Ausnahmen in Ihrer Schnittstelle implementiert werden können, und erfassen mögliche Ausnahmen, klare Ausgabe, gute Funktion Autismus; Anschließend sollten Sie auf der Grundlage der Gewährleistung der Geschäftsinformation die Benutzeroberfläche als Benutzer in Bezug auf Benutzernutzungsgewohnheiten und andere Aspekte entwerfen. Es ist sehr interessant, oder?