Mari kita bicara tentang mengapa saya menulis ini dulu. Ketika saya pergi ke wawancara, saya pergi ke kota wawancara Alibaba yang ditunjuk pada pukul 11 malam sebelum wawancara, dan saya menemukan sebuah hotel dan tinggal di sekitar jam 1. , yang secara langsung menyebabkan hasil yang buruk dari wawancara pada hari berikutnya (untuk udang besar yang mencari pekerjaan seharusnya tidak mengatakan tragedi pada udang. Masih sangat penting untuk dipersiapkan sebelumnya). Satu jam (ketika saya kembali dari wawancara, saya hampir tertidur ketika saya berjalan, sedih !!) Ketika wawancara akan berakhir, pewawancara menanyakan pertanyaan tentang urutan Fibonacci. Dan saya hanya tahu bahwa saya harus menetapkan tiga variabel atau menginisialisasi mereka dengan daftar Akhirnya, saya hanya dapat menulis metode pertama berikut di bawah induksi langkah demi langkah pewawancara. Periode emas untuk reformasi dan penambangan emas (Anda dapat pergi dengan cepat jika Anda memiliki kemampuan). Dengan sampah, untuk analisis data, Alibaba dapat menganalisis beragam data detail pengguna yang telah dikuasai, dan dapat lebih baik menemukan selera dan kebutuhan pengguna, memberikan dorongan dorongan yang lebih akurat dan dorongan iklan yang akurat. Jika mimpi masa depan Tencent adalah menjadi air, listrik dan gas dalam kehidupan pengguna, maka kemungkinan impian masa depan Alibaba adalah makanan, pakaian, perumahan dan transportasi, dan air, listrik dan pengumpulan gas, dll. O (∩_∩) O ~ Mari kita beralih ke topik.
Untuk desainer algoritma yang sangat baik, hanya ada dua hal yang perlu diperhatikan berdasarkan implementasi Badan Fungsi Program: Satu adalah kompleksitas waktu dari algoritma desain, dan yang lainnya adalah kompleksitas ruang (untuk membuatnya terus terang, itu adalah dengan blak -blakan, itu adalah hal yang terus terang, itu adalah dengan blak -blakan, itu adalah dengan blak -blakan, itu adalah dengan blak -blakan, itu adalah dengan blak -blakan, itu adalah dengan blak -blakan, itu adalah dengan blak -blakan, itu adalah dengan blak -blakan, itu adalah dengan blak -blakan, itu adalah hal yang blak -blakan, itu bluntil Waktu dan memori yang digunakan untuk menjalankan program dan jumlah memori yang ditempati olehnya. Persyaratan, umumnya pertukaran sumber daya untuk waktu atau objek yang umum digunakan pada umumnya akan berada dalam memori untuk meningkatkan waktu respons (teknologi caching dan sebagian besar database NoSQL yang paling populer digunakan). untuk sistem tertanam.
Mari kita bicara tentang tiga implementasi seri Febonasi.
Pertama, mari kita bicara tentang urutan Febonasi:
Dari sudut pandang tekstual, urutan Fibonacci dimulai dengan 0 dan 1, dan koefisien Fibonacci berikutnya ditambahkan oleh dua angka sebelumnya, dan bentuk urutan adalah sebagai berikut:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946 , …………………
Dalam matematika, itu didefinisikan oleh metode rekursif:
F_0 = 0
F_1 = 1
F_n = f_ {n-1}+ f_ {n-2}
Menerapkan persyaratan: Masukkan nomor seri n dan kembali untuk mendapatkan nomor Febonacci yang sesuai
Implementasi Program 1 - Fungsi Sendiri
Salinan kode adalah sebagai berikut:
/**
* Fungsi Sendiri
* @Title: fntype1
* @Description: TODO
* @param @param n
* @param @return
* @return int
* @Throws Exception
*/
public int fntype1 (int n) melempar pengecualian {
if (n == 0) {
kembali 0;
} lain jika (n == 1 || n == 2) {
kembali 1;
} lain jika (n> 2) {
int temp = fntype1 (n-1)+fntype1 (n-2);
if (temp <0) {
Lemparkan pengecualian baru ("Nilai tidak valid untuk tipe int, terlalu besar");
}kalau tidak{
kembalikan suhu;
}
}kalau tidak{
Lempar Pengecualian Baru ("Nilai IlegalArgument untuk N, silakan masukkan n> = 0");
}
}
Kerugian dari metode ini: Sejumlah besar iterasi terus -menerus mengonsumsi ruang tumpukan (mereka yang terlibat dalam pengembangan web, debugging dan pemeliharaan harus mengetahui nilai sumber daya tumpukan server. Jika sejumlah besar iterasi panggilan bersamaan menyebabkan sumber daya server didaur ulang Untuk waktu yang lama, menghasilkan crash server web). terjadi dan debugging sulit.
Implementasi Program 2 - Time to Space
Salinan kode adalah sebagai berikut:
/**
* Waktunya mengubah ruang
* @Title: fntype2
* @Description: TODO
* @param @param n
* @param @return
* @return int (n <0 return -1, di luar max int size return -2)
* @Throws
*/
public int fntype2 (int n) {
Hasil int = -1;
int temp1 = 0;
int temp2 = 1;
untuk (int index = 0; index <= n; index ++) {
if (index == 0) {
hasil = temp1;
} lain jika (index == 1) {
hasil = temp2;
}kalau tidak{
hasil = temp1+temp2;
if (hasil <0) {
hasil = -2;
merusak;
}
temp1 = temp2;
temp2 = hasil;
}
}
hasil pengembalian;
}
Metode ini terutama digunakan dalam: Skenario 1: Untuk skenario di mana objek atau variabel lebih jarang digunakan dan tidak akan digunakan lagi setelah digunakan sekali; Metode ini sering digunakan dalam desain;
Implementasi Program 3 - Ruang untuk Waktu
Salinan kode adalah sebagai berikut:
Daftar statis pribadi <Integer> fndata = ArrayList baru <Integer> ();
private static final int maxSize = 50000;
/**
* Inisialisasi
* @Title: setFnData
* @Description: TODO
* @param
* @return batal
* @Throws
*/
private static void setFnData () {
Hasil int = -1;
int temp1 = 0;
int temp2 = 1;
untuk (int index = 0; index <= maxSize; index ++) {
if (index == 0) {
hasil = temp1;
} lain jika (index == 1) {
hasil = temp2;
}kalau tidak{
hasil = temp1+temp2;
if (hasil <0) {
hasil = -2;
merusak;
}
temp1 = temp2;
temp2 = hasil;
}
fndata.add (hasil);
}
}
/**
* Antarmuka eksternal
* @Title: getFnData
* @Description: TODO
* @param @param n
* @param @return
* @return int <span style = "font-family: sans-serif;"> (n di luar fndata.size () dan n <0 return -1) </span>
* @Throws
*/
publik int getfndata (int n) {
if (fndata.size () == 0) {
setFnData ();
}
if (fndata.size ()> n && n> = 0) {
return fndata.get (n);
}kalau tidak{
kembali -1;
}
}
Metode ini umumnya digunakan dalam skenario di mana objek atau variabel ada atau sering dipanggil di seluruh siklus hidup program, seperti memanggil antarmuka layanan web eksternal, lapisan persistensi abstraksi, pemuatan parameter file konfigurasi yang umum digunakan, dll.
Kasus Uji:
Salinan kode adalah sebagai berikut:
paket com.dbc.yangg.swing.test;
impor java.util.arraylist;
impor java.util.list;
/**
* Masukkan nomor urutan n dan kembali untuk mendapatkan nomor Febonacci yang sesuai
* @ClassName: init
* @Description: TODO
* @author [email protected]
* @Date 10 Januari 2014 jam 19:52:13
*
*/
init kelas publik {
/**
* Fungsi Sendiri
* @Title: fntype1
* @Description: TODO
* @param @param n
* @param @return
* @return int
* @Throws Exception
*/
public int fntype1 (int n) melempar pengecualian {
if (n == 0) {
kembali 0;
} lain jika (n == 1 || n == 2) {
kembali 1;
} lain jika (n> 2) {
int temp = fntype1 (n-1)+fntype1 (n-2);
if (temp <0) {
Lemparkan pengecualian baru ("Nilai tidak valid untuk tipe int, terlalu besar");
}kalau tidak{
kembalikan suhu;
}
}kalau tidak{
Lempar Pengecualian Baru ("Nilai IlegalArgument untuk N, silakan masukkan n> = 0");
}
}
/**
* Waktunya mengubah ruang
* @Title: fntype2
* @Description: TODO
* @param @param n
* @param @return
* @return int (n <0 return -1, di luar max int size return -2)
* @Throws
*/
public int fntype2 (int n) {
Hasil int = -1;
int temp1 = 0;
int temp2 = 1;
untuk (int index = 0; index <= n; index ++) {
if (index == 0) {
hasil = temp1;
} lain jika (index == 1) {
hasil = temp2;
}kalau tidak{
hasil = temp1+temp2;
if (hasil <0) {
hasil = -2;
merusak;
}
temp1 = temp2;
temp2 = hasil;
}
}
hasil pengembalian;
}
Daftar statis pribadi <Integer> fndata = ArrayList baru <Integer> ();
private static final int maxSize = 50000;
/**
* Ruang untuk mengubah waktu
* @Title: setFnData
* @Description: TODO
* @param
* @return batal
* @Throws
*/
private static void setFnData () {
Hasil int = -1;
int temp1 = 0;
int temp2 = 1;
untuk (int index = 0; index <= maxSize; index ++) {
if (index == 0) {
hasil = temp1;
} lain jika (index == 1) {
hasil = temp2;
}kalau tidak{
hasil = temp1+temp2;
if (hasil <0) {
hasil = -2;
merusak;
}
temp1 = temp2;
temp2 = hasil;
}
fndata.add (hasil);
}
}
/**
*
* @Title: getFnData
* @Description: TODO
* @param @param n
* @param @return
* @return int (n di luar fndata.size () dan n <0 return -1)
* @Throws
*/
publik int getfndata (int n) {
if (fndata.size () == 0) {
setFnData ();
}
if (fndata.size ()> n && n> = 0) {
return fndata.get (n);
}kalau tidak{
kembali -1;
}
}
/**
*
* @Title: Main
* @Description: TODO
* @param @param argv
* @return batal
* @Throws
*/
public static void main (string [] argv) {
Init init = new init ();
int n = 46;
mencoba {
System.out.println ("type1 ="+init.fntype1 (n));
} catch (Exception e) {
// TODO Blok tangkapan yang dihasilkan otomatis
System.out.println (e.getMessage ());
}
System.out.println ("type2 ="+init.fntype2 (n));
System.out.println ("type3 ="+init.getFnData (n));
}
}
Hasil output:
Salinan kode adalah sebagai berikut:
Type1 = 1836311903
Type2 = 1836311903
Type3 = 1836311903
Saat merancang algoritma, jangan mengikuti konsep secara membabi buta.
Izinkan saya mengeluh: Saya pribadi percaya bahwa desain struktur data yang sangat baik dapat menyederhanakan kompleksitas desain algoritma dan meningkatkan keterbacaan kode, skalabilitas program dan efisiensi eksekusi;
Izinkan saya mengeluh lagi: tiga prinsip harus diikuti ketika melakukan analisis permintaan: 1. Analisis dari perspektif pengguna dan cara berpikir; Prinsip -prinsip pengembangan program adalah: secara aktif meningkatkan selera sendiri, dan menganalisis fungsi dari perspektif penggunaan pengguna dan skenario penggunaan; Situasi apa yang ada di berikut ini akan disebut, pengecualian apa yang mungkin disebabkan oleh parameter yang lewat, pengecualian apa yang mungkin terjadi dalam implementasi antarmuka Anda dan menangkap kemungkinan pengecualian, output yang jelas, autisme fungsi yang baik; Kemudian Anda berdasarkan memastikan implementasi bisnis, Anda harus merancang UI sebagai pengguna dalam hal kebiasaan penggunaan pengguna dan aspek lainnya. Ini sangat menarik, bukan?