1 00:00:00,000 --> 00:00:02,640 [Powered by Google Translate] [Seminar: Wawancara Teknis] 2 00:00:02,640 --> 00:00:04,630 [Kenny Yu, Universitas Harvard] 3 00:00:04,630 --> 00:00:08,910 [Ini adalah CS50.] [CS50.TV] 4 00:00:08,910 --> 00:00:12,420 Hi semuanya, aku Kenny. Saat ini saya belajar ilmu komputer junior. 5 00:00:12,420 --> 00:00:17,310 Aku CS mantan TF, dan aku berharap aku punya ini ketika saya masih seorang underclassman, 6 00:00:17,310 --> 00:00:19,380 dan itulah sebabnya aku memberi seminar ini. 7 00:00:19,380 --> 00:00:21,370 Jadi saya harap Anda menikmatinya. 8 00:00:21,370 --> 00:00:23,470 Seminar ini adalah tentang wawancara teknis, 9 00:00:23,470 --> 00:00:26,650 dan semua sumber daya yang saya dapat ditemukan di link ini, 10 00:00:26,650 --> 00:00:32,350 link ini di sini, beberapa sumber daya. 11 00:00:32,350 --> 00:00:36,550 Jadi saya membuat daftar masalah, sebenarnya, cukup beberapa masalah. 12 00:00:36,550 --> 00:00:40,800 Juga seorang jenderal sumber halaman di mana kita dapat menemukan tips 13 00:00:40,800 --> 00:00:42,870 tentang bagaimana mempersiapkan untuk wawancara, 14 00:00:42,870 --> 00:00:46,470 tips tentang apa yang harus Anda lakukan selama wawancara yang sebenarnya, 15 00:00:46,470 --> 00:00:51,910 serta bagaimana pendekatan masalah dan sumber daya untuk referensi di masa mendatang. 16 00:00:51,910 --> 00:00:53,980 Ini semua secara online. 17 00:00:53,980 --> 00:00:58,290 Dan hanya untuk Pendahuluan ini seminar, disclaimer, 18 00:00:58,290 --> 00:01:00,690 seperti ini tidak seharusnya - persiapan wawancara Anda 19 00:01:00,690 --> 00:01:02,800 seharusnya tidak terbatas pada daftar ini. 20 00:01:02,800 --> 00:01:04,750 Ini hanya dimaksudkan untuk menjadi panduan, 21 00:01:04,750 --> 00:01:08,890 dan Anda pasti harus mengambil semua yang saya katakan dengan sebutir garam, 22 00:01:08,890 --> 00:01:14,620 tetapi juga menggunakan segala sesuatu yang saya digunakan untuk membantu Anda dalam persiapan wawancara Anda. 23 00:01:14,620 --> 00:01:16,400 >> Aku akan mempercepat melalui beberapa slide berikutnya 24 00:01:16,400 --> 00:01:18,650 sehingga kami bisa sampai ke studi kasus aktual. 25 00:01:18,650 --> 00:01:23,630 Struktur wawancara untuk posisi yang rekayasa perangkat lunak, 26 00:01:23,630 --> 00:01:26,320 biasanya itu adalah 30 sampai 45 menit, 27 00:01:26,320 --> 00:01:29,810 beberapa putaran, tergantung pada perusahaan. 28 00:01:29,810 --> 00:01:33,090 Sering kali Anda akan coding di papan putih. 29 00:01:33,090 --> 00:01:35,960 Jadi papan putih seperti ini, tetapi sering pada skala yang lebih kecil. 30 00:01:35,960 --> 00:01:38,540 Jika Anda memiliki sebuah wawancara telepon, Anda mungkin akan menggunakan 31 00:01:38,540 --> 00:01:44,030 baik collabedit atau Doc Google sehingga mereka dapat melihat Anda hidup coding 32 00:01:44,030 --> 00:01:46,500 saat Anda sedang diwawancarai melalui telepon. 33 00:01:46,500 --> 00:01:48,490 Wawancara itu sendiri biasanya 2 atau 3 masalah 34 00:01:48,490 --> 00:01:50,620 menguji pengetahuan ilmu komputer Anda. 35 00:01:50,620 --> 00:01:54,490 Dan itu akan hampir pasti melibatkan coding. 36 00:01:54,490 --> 00:01:59,540 Jenis-jenis pertanyaan yang Anda akan melihat biasanya struktur data dan algoritma. 37 00:01:59,540 --> 00:02:02,210 Dan dalam melakukan jenis-jenis masalah, 38 00:02:02,210 --> 00:02:07,830 mereka akan meminta Anda, seperti, apa waktu dan kompleksitas ruang, big O? 39 00:02:07,830 --> 00:02:09,800 Seringkali mereka juga meminta pertanyaan tingkat yang lebih tinggi, 40 00:02:09,800 --> 00:02:12,530 sehingga, merancang sistem, 41 00:02:12,530 --> 00:02:14,770 bagaimana Anda lay out kode Anda? 42 00:02:14,770 --> 00:02:18,370 Apa interface, apa kelas, apa modul yang Anda miliki di sistem anda, 43 00:02:18,370 --> 00:02:20,900 dan bagaimana ini berinteraksi bersama-sama? 44 00:02:20,900 --> 00:02:26,130 Jadi struktur data dan algoritma serta merancang sistem. 45 00:02:26,130 --> 00:02:29,180 >> Beberapa tips umum sebelum kita menyelam ke studi kasus kami. 46 00:02:29,180 --> 00:02:32,300 Saya pikir aturan yang paling penting adalah selalu berpikir keras. 47 00:02:32,300 --> 00:02:36,980 Wawancara ini seharusnya menjadi kesempatan Anda untuk pamer proses berpikir Anda. 48 00:02:36,980 --> 00:02:39,820 Titik wawancara adalah untuk pewawancara untuk mengukur 49 00:02:39,820 --> 00:02:42,660 bagaimana Anda berpikir dan bagaimana Anda melewati masalah. 50 00:02:42,660 --> 00:02:45,210 Hal terburuk yang dapat Anda lakukan adalah diam sepanjang wawancara keseluruhan. 51 00:02:45,210 --> 00:02:50,090 Itu hanya tidak baik. 52 00:02:50,090 --> 00:02:53,230 Bila Anda diberi pertanyaan, Anda juga ingin memastikan bahwa Anda memahami pertanyaan. 53 00:02:53,230 --> 00:02:55,350 Jadi ulangi pertanyaan kembali kata-kata sendiri 54 00:02:55,350 --> 00:02:58,920 dan berusaha untuk bekerja menyeluruh beberapa kasus tes sederhana 55 00:02:58,920 --> 00:03:01,530 untuk memastikan bahwa Anda memahami pertanyaan. 56 00:03:01,530 --> 00:03:05,510 Bekerja melalui uji kasus beberapa juga akan memberikan intuisi tentang bagaimana untuk memecahkan masalah ini. 57 00:03:05,510 --> 00:03:11,210 Anda bahkan mungkin menemukan beberapa pola untuk membantu Anda memecahkan masalah. 58 00:03:11,210 --> 00:03:14,500 Tip besar mereka adalah untuk tidak frustrasi. 59 00:03:14,500 --> 00:03:17,060 Jangan frustrasi. 60 00:03:17,060 --> 00:03:19,060 Wawancara yang menantang, tapi hal terburuk yang dapat Anda lakukan, 61 00:03:19,060 --> 00:03:23,330 selain menjadi diam, yang akan tampak frustrasi. 62 00:03:23,330 --> 00:03:27,410 Anda tidak ingin memberikan kesan bahwa untuk pewawancara. 63 00:03:27,410 --> 00:03:33,960 Satu hal yang Anda - jadi, banyak orang, ketika mereka pergi ke sebuah wawancara, 64 00:03:33,960 --> 00:03:37,150 mereka berusaha untuk mencoba untuk menemukan solusi terbaik pertama, 65 00:03:37,150 --> 00:03:39,950 ketika benar-benar, biasanya ada solusi mencolok. 66 00:03:39,950 --> 00:03:43,500 Mungkin lambat, mungkin tidak efisien, tetapi Anda hanya harus menyatakan hal itu, 67 00:03:43,500 --> 00:03:46,210 hanya sehingga Anda memiliki titik awal dari mana untuk bekerja lebih baik. 68 00:03:46,210 --> 00:03:48,270 Juga, menunjukkan solusinya adalah lambat, dalam hal 69 00:03:48,270 --> 00:03:52,160 big O kompleksitas waktu atau kompleksitas ruang, 70 00:03:52,160 --> 00:03:54,450 akan menunjukkan kepada pewawancara bahwa Anda memahami 71 00:03:54,450 --> 00:03:57,510 isu-isu saat menulis kode. 72 00:03:57,510 --> 00:04:01,440 Jadi jangan takut untuk datang dengan algoritma sederhana pertama 73 00:04:01,440 --> 00:04:04,950 dan kemudian bekerja lebih baik dari sana. 74 00:04:04,950 --> 00:04:09,810 Ada pertanyaan sejauh ini? Oke. 75 00:04:09,810 --> 00:04:11,650 >> Jadi mari kita menyelam ke masalah pertama kami. 76 00:04:11,650 --> 00:04:14,790 "Mengingat sebuah array bilangan bulat n, menulis fungsi yang mengocok array 77 00:04:14,790 --> 00:04:20,209 di tempat sehingga semua permutasi dari bilangan bulat n kemungkinan yang sama. " 78 00:04:20,209 --> 00:04:23,470 Dan menganggap Anda telah tersedia generator integer acak 79 00:04:23,470 --> 00:04:30,980 yang menghasilkan integer dalam jangkauan dari 0 sampai i, jangkauan setengah. 80 00:04:30,980 --> 00:04:32,970 Apakah semua orang mengerti pertanyaan ini? 81 00:04:32,970 --> 00:04:39,660 Saya memberi Anda sebuah array bilangan bulat n, dan aku ingin kau shuffle itu. 82 00:04:39,660 --> 00:04:46,050 Dalam direktori saya, saya menulis beberapa program untuk menunjukkan apa yang saya maksud. 83 00:04:46,050 --> 00:04:48,910 Aku akan mengocok sebuah array dari 20 elemen, 84 00:04:48,910 --> 00:04:52,490 dari -10 sampai +9, 85 00:04:52,490 --> 00:04:57,050 dan saya ingin Anda untuk menampilkan daftar seperti ini. 86 00:04:57,050 --> 00:05:02,890 Jadi ini adalah array input diurutkan saya, dan saya ingin Anda untuk mengocok itu. 87 00:05:02,890 --> 00:05:07,070 Kita akan melakukannya lagi. 88 00:05:07,070 --> 00:05:13,780 Apakah setiap orang memahami pertanyaan? Oke. 89 00:05:13,780 --> 00:05:16,730 Jadi terserah Anda. 90 00:05:16,730 --> 00:05:21,220 Apa adalah beberapa ide? Dapatkah Anda melakukannya sebagai n, ^ 2 n log n, n? 91 00:05:21,220 --> 00:05:34,400 Terbuka untuk saran. 92 00:05:34,400 --> 00:05:37,730 Oke. Jadi satu ide, disarankan oleh Emmy, 93 00:05:37,730 --> 00:05:45,300 adalah pertama menghitung nomor acak, integer acak, dalam rentang dari 0 sampai 20. 94 00:05:45,300 --> 00:05:49,840 Jadi berasumsi array kita memiliki panjang 20. 95 00:05:49,840 --> 00:05:54,800 Dalam diagram kita dari 20 elemen, 96 00:05:54,800 --> 00:05:58,560 ini adalah array masukan kami. 97 00:05:58,560 --> 00:06:04,590 Dan sekarang, saran nya adalah untuk membuat array baru, 98 00:06:04,590 --> 00:06:08,440 jadi ini akan menjadi output array. 99 00:06:08,440 --> 00:06:12,880 Dan berdasarkan pada saya dikembalikan oleh rand - 100 00:06:12,880 --> 00:06:17,580 jadi jika saya adalah, katakanlah, 17, 101 00:06:17,580 --> 00:06:25,640 menyalin elemen ke-17 ke posisi pertama. 102 00:06:25,640 --> 00:06:30,300 Sekarang kita perlu menghapus - kita perlu menggeser semua elemen di sini 103 00:06:30,300 --> 00:06:36,920 lebih sehingga kita memiliki celah di akhir dan tidak ada lubang di tengah. 104 00:06:36,920 --> 00:06:39,860 Dan sekarang kita ulangi proses. 105 00:06:39,860 --> 00:06:46,360 Sekarang kita memilih integer acak baru antara 0 dan 19. 106 00:06:46,360 --> 00:06:52,510 Kami memiliki i baru di sini, dan kami salin elemen ini dalam posisi ini. 107 00:06:52,510 --> 00:07:00,960 Kemudian kita menggeser item lebih dan kami ulangi proses sampai kita memiliki array penuh baru kami. 108 00:07:00,960 --> 00:07:05,890 Apa waktu berjalan dari algoritma ini? 109 00:07:05,890 --> 00:07:08,110 Nah, mari kita mempertimbangkan dampak dari ini. 110 00:07:08,110 --> 00:07:10,380 Kami pergeseran setiap elemen. 111 00:07:10,380 --> 00:07:16,800 Ketika kita menghapus i, kita menggeser semua elemen setelah ke kiri. 112 00:07:16,800 --> 00:07:21,600 Dan itu adalah O (n) biaya 113 00:07:21,600 --> 00:07:26,100 karena apa jika kita menghapus elemen pertama? 114 00:07:26,100 --> 00:07:29,670 Jadi untuk penghapusan masing-masing, kita hapus - 115 00:07:29,670 --> 00:07:32,170 penghapusan masing-masing menimbulkan O (n) operasi, 116 00:07:32,170 --> 00:07:41,520 dan karena kita memiliki n kepindahan, ini mengarah ke shuffle (n ^ 2) O. 117 00:07:41,520 --> 00:07:49,550 Oke. Jadi baik awal. Awal yang baik. 118 00:07:49,550 --> 00:07:55,290 >> Saran lain adalah dengan menggunakan sesuatu yang dikenal sebagai shuffle Knuth, 119 00:07:55,290 --> 00:07:57,540 atau shuffle Fisher-Yates. 120 00:07:57,540 --> 00:07:59,630 Dan itu benar-benar mengocok waktu linier. 121 00:07:59,630 --> 00:08:02,200 Dan ide ini sangat mirip. 122 00:08:02,200 --> 00:08:05,160 Sekali lagi, kami memiliki berbagai masukan kami, 123 00:08:05,160 --> 00:08:08,580 tapi bukannya menggunakan dua array untuk masukan kami / output, 124 00:08:08,580 --> 00:08:13,590 kita menggunakan bagian pertama dari array untuk melacak porsi kami dikocok, 125 00:08:13,590 --> 00:08:18,400 dan kita melacak, dan kemudian kita meninggalkan sisa array kita untuk porsi unshuffled. 126 00:08:18,400 --> 00:08:24,330 Jadi, inilah yang saya maksud. Kami memulai dengan - kita memilih suatu i, 127 00:08:24,330 --> 00:08:30,910 sebuah array dari 0 sampai 20. 128 00:08:30,910 --> 00:08:36,150 Pointer saat ini kami menunjuk ke indeks pertama. 129 00:08:36,150 --> 00:08:39,590 Kami memilih beberapa i sini 130 00:08:39,590 --> 00:08:42,740 dan sekarang kita bertukar. 131 00:08:42,740 --> 00:08:47,690 Jadi jika ini adalah 5 dan ini adalah 4, 132 00:08:47,690 --> 00:08:57,150 array yang dihasilkan akan memiliki 5 di sini dan di sini 4. 133 00:08:57,150 --> 00:09:00,390 Dan sekarang kita perhatikan penanda di sini. 134 00:09:00,390 --> 00:09:05,770 Semuanya ke kiri yang dikocok, 135 00:09:05,770 --> 00:09:15,160 dan segala sesuatu ke kanan yang unshuffled. 136 00:09:15,160 --> 00:09:17,260 Dan sekarang kita dapat mengulangi proses tersebut. 137 00:09:17,260 --> 00:09:25,210 Kami memilih indeks acak antara 1 dan 20 sekarang. 138 00:09:25,210 --> 00:09:30,650 Jadi misalkan baru kami i di sini. 139 00:09:30,650 --> 00:09:39,370 Sekarang kita bertukar saya ini dengan posisi saat ini baru kami di sini. 140 00:09:39,370 --> 00:09:44,790 Jadi kita yang swapping bolak-balik seperti ini. 141 00:09:44,790 --> 00:09:51,630 Biarkan aku membawa kode untuk membuatnya lebih konkret. 142 00:09:51,630 --> 00:09:55,290 Kita mulai dengan pilihan kami dari i - 143 00:09:55,290 --> 00:09:58,370 kita mulai dengan i sama dengan 0, kita memilih j lokasi acak 144 00:09:58,370 --> 00:10:02,420 di bagian unshuffled dari array, saya ke n-1. 145 00:10:02,420 --> 00:10:07,280 Jadi jika aku di sini, memilih indeks acak antara sini dan seluruh array, 146 00:10:07,280 --> 00:10:12,410 dan kami bertukar. 147 00:10:12,410 --> 00:10:17,550 Ini semua kode yang diperlukan untuk mengocok array Anda. 148 00:10:17,550 --> 00:10:21,670 Ada pertanyaan? 149 00:10:21,670 --> 00:10:25,530 >> Nah, salah satu pertanyaan yang diperlukan, mengapa ini benar? 150 00:10:25,530 --> 00:10:28,360 Mengapa setiap permutasi kemungkinan yang sama? 151 00:10:28,360 --> 00:10:30,410 Dan aku tidak akan pergi melalui bukti ini, 152 00:10:30,410 --> 00:10:35,970 tetapi banyak masalah dalam ilmu komputer dapat dibuktikan melalui induksi. 153 00:10:35,970 --> 00:10:38,520 Berapa banyak dari Anda sudah familiar dengan induksi? 154 00:10:38,520 --> 00:10:40,590 Oke. Cool. 155 00:10:40,590 --> 00:10:43,610 Sehingga Anda dapat membuktikan kebenaran dari algoritma ini dengan induksi sederhana, 156 00:10:43,610 --> 00:10:49,540 di mana hipotesis induksi Anda akan, menganggap bahwa 157 00:10:49,540 --> 00:10:53,290 mengocok saya kembali setiap kemungkinan yang sama permutasi 158 00:10:53,290 --> 00:10:56,120 sampai dengan elemen i pertama. 159 00:10:56,120 --> 00:10:58,300 Sekarang, pertimbangkan i + 1. 160 00:10:58,300 --> 00:11:02,550 Dan dengan cara kita memilih j indeks kami untuk swap, 161 00:11:02,550 --> 00:11:05,230 ini mengarah ke - dan kemudian Anda menyusun rincian, 162 00:11:05,230 --> 00:11:07,390 setidaknya bukti penuh mengapa algoritma ini kembali 163 00:11:07,390 --> 00:11:12,800 setiap permutasi dengan probabilitas kemungkinan yang sama. 164 00:11:12,800 --> 00:11:15,940 >> Semua, masalah sebelah kanan. 165 00:11:15,940 --> 00:11:19,170 Jadi "diberikan sebuah array bilangan bulat, postive, nol, negatif, 166 00:11:19,170 --> 00:11:21,290 menulis sebuah fungsi yang menghitung jumlah maksimum 167 00:11:21,290 --> 00:11:24,720 dari setiap subarray continueous dari array masukan. " 168 00:11:24,720 --> 00:11:28,370 Contoh di sini adalah, dalam kasus di mana semua nomor yang positif, 169 00:11:28,370 --> 00:11:31,320 maka saat ini pilihan terbaik adalah untuk mengambil seluruh array. 170 00:11:31,320 --> 00:11:34,690 1, 2, 3, 4, sama dengan 10. 171 00:11:34,690 --> 00:11:36,780 Bila Anda memiliki beberapa negatif di sana, 172 00:11:36,780 --> 00:11:38,690 dalam hal ini kita hanya ingin dua yang pertama 173 00:11:38,690 --> 00:11:44,590 karena memilih -1 dan / atau -3 akan membawa jumlah kami turun. 174 00:11:44,590 --> 00:11:48,120 Kadang-kadang kita mungkin harus mulai di tengah-tengah array. 175 00:11:48,120 --> 00:11:53,500 Kadang-kadang kita ingin memilih apa-apa sama sekali, yang terbaik untuk tidak mengambil apa pun. 176 00:11:53,500 --> 00:11:56,490 Dan kadang-kadang lebih baik untuk mengambil musim gugur, 177 00:11:56,490 --> 00:12:07,510 karena hal setelah itu super besar. Jadi setiap ide? 178 00:12:07,510 --> 00:12:10,970 (Mahasiswa, tidak dapat dimengerti) >> Ya. 179 00:12:10,970 --> 00:12:13,560 Misalkan saya tidak mengambil -1. 180 00:12:13,560 --> 00:12:16,170 Kemudian baik saya memilih 1.000 dan 20.000, 181 00:12:16,170 --> 00:12:18,630 atau aku hanya memilih 3 miliar. 182 00:12:18,630 --> 00:12:20,760 Nah, pilihan terbaik adalah untuk mengambil semua nomor. 183 00:12:20,760 --> 00:12:24,350 Ini -1, meskipun negatif, 184 00:12:24,350 --> 00:12:31,340 jumlah keseluruhan lebih baik daripada yang saya tidak mengambil -1. 185 00:12:31,340 --> 00:12:36,460 Jadi salah satu tips yang saya sebutkan sebelumnya adalah untuk menyatakan secara jelas jelas 186 00:12:36,460 --> 00:12:40,540 dan solusi brute force pertama. 187 00:12:40,540 --> 00:12:44,340 Apa solusi kekerasan dalam masalah ini? Ya? 188 00:12:44,340 --> 00:12:46,890 [Jane] Nah, saya pikir solusi brute force 189 00:12:46,890 --> 00:12:52,600 akan menjumlahkan semua kombinasi yang mungkin (tidak dapat dimengerti). 190 00:12:52,600 --> 00:12:58,250 [Yu] Oke. Jadi, ide Jane adalah untuk mengambil setiap kemungkinan - 191 00:12:58,250 --> 00:13:01,470 Saya parafrase - adalah untuk mengambil setiap subarray terus menerus mungkin, 192 00:13:01,470 --> 00:13:07,840 menghitung penjumlahan, dan kemudian mengambil maksimum dari semua subarrays terus menerus mungkin. 193 00:13:07,840 --> 00:13:13,310 Apa yang unik mengidentifikasi subarray dalam berbagai masukan saya? 194 00:13:13,310 --> 00:13:17,380 Seperti, apa dua hal yang saya butuhkan? Ya? 195 00:13:17,380 --> 00:13:19,970 (Mahasiswa, tidak dapat dimengerti) >> Kanan. 196 00:13:19,970 --> 00:13:22,130 Sebuah batas bawah pada indeks dan indeks batas atas 197 00:13:22,130 --> 00:13:28,300 unik menentukan subarray terus menerus. 198 00:13:28,300 --> 00:13:31,400 [Mahasiswa Wanita] Apakah kita memperkirakan itu array nomor unik? 199 00:13:31,400 --> 00:13:34,280 [Yu] No Jadi pertanyaannya adalah, apakah kita mengasumsikan array kita - 200 00:13:34,280 --> 00:13:39,000 adalah array kita semua nomor yang unik, dan jawabannya tidak. 201 00:13:39,000 --> 00:13:43,390 >> Jika kita menggunakan kekerasan solusi kami, maka mulai / akhir indeks 202 00:13:43,390 --> 00:13:47,200 unik menentukan subarray berkelanjutan kami. 203 00:13:47,200 --> 00:13:51,680 Jadi jika kita iterate untuk semua entri permulaan yang memungkinkan, 204 00:13:51,680 --> 00:13:58,320 dan untuk semua entri end> ​​atau = untuk memulai, dan 00:14:05,570 Anda menghitung penjumlahan, dan kemudian kita mengambil jumlah maksimum yang telah kita lihat sejauh ini. 206 00:14:05,570 --> 00:14:07,880 Apakah ini jelas? 207 00:14:07,880 --> 00:14:12,230 Apa O besar dari solusi ini? 208 00:14:12,230 --> 00:14:16,660 Timewise. 209 00:14:16,660 --> 00:14:18,860 Tidak cukup n ^ 2. 210 00:14:18,860 --> 00:14:25,250 Perhatikan bahwa kita iterate dari 0 sampai n, 211 00:14:25,250 --> 00:14:27,520 jadi itu salah satu untuk loop. 212 00:14:27,520 --> 00:14:35,120 Kami iterate lagi dari hampir awal sampai akhir, yang lain untuk loop. 213 00:14:35,120 --> 00:14:37,640 Dan sekarang, dalam bahwa, kita harus meringkas setiap entri, 214 00:14:37,640 --> 00:14:43,810 sehingga itu lain untuk loop. Jadi kami memiliki tiga bersarang untuk loop, n ^ 3. 215 00:14:43,810 --> 00:14:46,560 Oke. Ini berjalan sebagai titik awal. 216 00:14:46,560 --> 00:14:53,180 Solusi kami adalah tidak lebih buruk dari n ^ 3. 217 00:14:53,180 --> 00:14:55,480 Apakah setiap orang memahami solusi kekerasan? 218 00:14:55,480 --> 00:14:59,950 >> Oke. Sebuah solusi yang lebih baik adalah menggunakan ide yang disebut pemrograman dinamis. 219 00:14:59,950 --> 00:15:03,040 Jika Anda mengambil CS124, yaitu Algoritma dan Struktur Data, 220 00:15:03,040 --> 00:15:05,680 Anda akan menjadi sangat akrab dengan teknik ini. 221 00:15:05,680 --> 00:15:12,190 Dan gagasan itu, cobalah untuk membangun solusi untuk masalah yang lebih kecil pertama. 222 00:15:12,190 --> 00:15:17,990 Apa yang saya maksudkan dengan ini adalah, saat ini kami perlu khawatir tentang dua hal: awal dan akhir. 223 00:15:17,990 --> 00:15:29,340 Dan itu menjengkelkan. Bagaimana jika kita bisa menyingkirkan salah satu parameter? 224 00:15:29,340 --> 00:15:32,650 Satu ide adalah - kita mengingat masalah asli kami, 225 00:15:32,650 --> 00:15:37,470 menemukan jumlah maksimum setiap subarray dalam range [O, n-1]. 226 00:15:37,470 --> 00:15:47,400 Dan sekarang kami memiliki subproblem baru, di mana kita tahu, dalam indeks kami saat i, 227 00:15:47,400 --> 00:15:52,520 kita tahu bahwa kita harus menyimpulkan ada. Subarray kami harus berakhir di indeks saat ini. 228 00:15:52,520 --> 00:15:57,640 Jadi masalah yang tersisa adalah, di mana harus kita mulai subarray kami? 229 00:15:57,640 --> 00:16:05,160 Apakah ini masuk akal? Oke. 230 00:16:05,160 --> 00:16:12,030 Jadi saya telah dikodekan up ini, dan mari kita lihat apa artinya ini. 231 00:16:12,030 --> 00:16:16,230 Dalam codirectory, ada program yang disebut subarray, 232 00:16:16,230 --> 00:16:19,470 dan dibutuhkan jumlah item, 233 00:16:19,470 --> 00:16:25,550 dan mengembalikan jumlah subarray maksimal dalam daftar saya dikocok. 234 00:16:25,550 --> 00:16:29,920 Jadi dalam hal ini, subarray maksimal kami adalah 3. 235 00:16:29,920 --> 00:16:34,850 Dan itu diambil dengan hanya menggunakan 2 dan 1. 236 00:16:34,850 --> 00:16:38,050 Mari kita jalankan lagi. Ini juga 3. 237 00:16:38,050 --> 00:16:40,950 Tapi kali ini, perhatikan bagaimana kita mendapat 3. 238 00:16:40,950 --> 00:16:46,690 Kami mengambil - kita hanya mengambil 3 itu sendiri 239 00:16:46,690 --> 00:16:49,980 karena itu dikelilingi oleh negatif pada kedua belah pihak, 240 00:16:49,980 --> 00:16:55,080 yang akan membawa penjumlahan <3. 241 00:16:55,080 --> 00:16:57,820 Mari kita berjalan pada 10 item. 242 00:16:57,820 --> 00:17:03,200 Kali ini 7, kita mengambil 3 terkemuka dan 4. 243 00:17:03,200 --> 00:17:09,450 Kali ini 8, dan kita mendapatkan bahwa dengan mengambil 1, 4 dan 3. 244 00:17:09,450 --> 00:17:16,310 Jadi untuk memberikan intuisi tentang bagaimana kita bisa memecahkan masalah ini berubah, 245 00:17:16,310 --> 00:17:18,890 mari kita lihat subarray ini. 246 00:17:18,890 --> 00:17:23,460 Kami diberi array masukan, dan kita tahu jawabannya adalah 8. 247 00:17:23,460 --> 00:17:26,359 Kami mengambil 1, 4, dan 3. 248 00:17:26,359 --> 00:17:29,090 Tapi mari kita lihat bagaimana kita benar-benar mendapat jawaban itu. 249 00:17:29,090 --> 00:17:34,160 Mari kita lihat pada subarray maksimal yang berakhir pada masing-masing indeks. 250 00:17:34,160 --> 00:17:40,780 Apa subarray maksimal yang harus berakhir di posisi pertama? 251 00:17:40,780 --> 00:17:46,310 [Mahasiswa] Zero. >> Nol. Hanya tidak mengambil -5. 252 00:17:46,310 --> 00:17:50,210 Di sini akan menjadi 0 juga. Ya? 253 00:17:50,210 --> 00:17:56,470 (Mahasiswa, tidak dapat dimengerti) 254 00:17:56,470 --> 00:17:58,960 [Yu] Oh, maaf, itu adalah -3. 255 00:17:58,960 --> 00:18:03,220 Jadi ini adalah 2, ini adalah -3. 256 00:18:03,220 --> 00:18:08,690 Oke. Jadi -4, apa subarray maksimal untuk mengakhiri posisi tersebut 257 00:18:08,690 --> 00:18:12,910 mana -4 adalah pada? Nol. 258 00:18:12,910 --> 00:18:22,570 Satu? 1, 5, 8. 259 00:18:22,570 --> 00:18:28,060 Sekarang, saya harus berakhir di lokasi di mana -2 adalah di. 260 00:18:28,060 --> 00:18:39,330 Jadi 6, 5, 7, dan yang terakhir adalah 4. 261 00:18:39,330 --> 00:18:43,480 Mengetahui bahwa ini adalah entri saya 262 00:18:43,480 --> 00:18:48,130 untuk masalah berubah di mana saya harus berakhir di masing-masing indeks, 263 00:18:48,130 --> 00:18:51,410 maka jawaban akhir saya hanya, mengambil menyapu di seberang, 264 00:18:51,410 --> 00:18:53,580 dan mengambil jumlah maksimum. 265 00:18:53,580 --> 00:18:55,620 Jadi dalam hal ini itu 8. 266 00:18:55,620 --> 00:19:00,010 Ini menyiratkan bahwa subarray maksimal berakhir pada indeks ini, 267 00:19:00,010 --> 00:19:04,970 dan mulai di suatu tempat sebelum itu. 268 00:19:04,970 --> 00:19:09,630 Apakah semua orang mengerti ini subarray berubah? 269 00:19:09,630 --> 00:19:22,160 >> Oke. Nah, mari kita mengetahui kekambuhan untuk ini. 270 00:19:22,160 --> 00:19:27,990 Mari kita mempertimbangkan hanya beberapa entri pertama. 271 00:19:27,990 --> 00:19:35,930 Jadi di sini itu 0, 0, 0, 1, 5, 8. 272 00:19:35,930 --> 00:19:39,790 Dan kemudian ada -2 sini, dan yang membawanya ke 6. 273 00:19:39,790 --> 00:19:50,800 Jadi jika saya sebut masuk di posisi i subproblem (i), 274 00:19:50,800 --> 00:19:54,910 bagaimana saya bisa menggunakan jawaban untuk subproblem sebelumnya 275 00:19:54,910 --> 00:19:59,360 untuk menjawab subproblem ini? 276 00:19:59,360 --> 00:20:04,550 Jika saya melihat, katakanlah, entri ini. 277 00:20:04,550 --> 00:20:09,190 Bagaimana saya bisa menghitung jawaban 6 dengan melihat 278 00:20:09,190 --> 00:20:18,780 kombinasi ini array dan jawaban atas subproblem sebelumnya dalam array ini? Ya? 279 00:20:18,780 --> 00:20:22,800 [Mahasiswa Wanita] Anda mengambil array jumlah 280 00:20:22,800 --> 00:20:25,430 dalam posisi tepat sebelum, jadi 8, 281 00:20:25,430 --> 00:20:32,170 dan kemudian Anda menambahkan subproblem saat ini. 282 00:20:32,170 --> 00:20:36,460 [Yu] Jadi saran nya adalah dengan melihat dua angka, 283 00:20:36,460 --> 00:20:40,090 ini dan nomor ini. 284 00:20:40,090 --> 00:20:50,130 Jadi ini 8 mengacu pada jawaban untuk subproblem yang (i - 1). 285 00:20:50,130 --> 00:20:57,300 Dan mari kita sebut A. masukan array saya 286 00:20:57,300 --> 00:21:01,470 Dalam rangka untuk menemukan subarray maksimal yang berakhir pada posisi i, 287 00:21:01,470 --> 00:21:03,980 Aku punya dua pilihan: Saya dapat melanjutkan subarray tersebut 288 00:21:03,980 --> 00:21:09,790 yang berakhir pada indeks sebelumnya, atau mulai array baru. 289 00:21:09,790 --> 00:21:14,190 Jika saya melanjutkan subarray yang dimulai pada indeks sebelumnya, 290 00:21:14,190 --> 00:21:19,260 maka jumlah maksimum yang dapat saya capai adalah jawaban atas subproblem sebelumnya 291 00:21:19,260 --> 00:21:24,120 ditambah entri array saat ini. 292 00:21:24,120 --> 00:21:27,550 Tapi, saya juga memiliki pilihan untuk memulai subarray baru, 293 00:21:27,550 --> 00:21:30,830 dalam hal jumlah adalah 0. 294 00:21:30,830 --> 00:21:42,860 Jadi jawabannya adalah max dari 0, subproblem i - 1, ditambah masuknya array saat ini. 295 00:21:42,860 --> 00:21:46,150 Apakah kekambuhan ini masuk akal? 296 00:21:46,150 --> 00:21:50,840 Kekambuhan kami, karena kami baru saja menemukan, adalah subproblem i 297 00:21:50,840 --> 00:21:54,740 adalah sama dengan maksimum dari subproblem sebelumnya ditambah entri array saya saat ini, 298 00:21:54,740 --> 00:22:01,490 yang berarti melanjutkan subarray sebelumnya, 299 00:22:01,490 --> 00:22:07,250 atau 0, memulai subarray baru di index saya saat ini. 300 00:22:07,250 --> 00:22:10,060 Dan setelah kami telah membangun tabel ini solusi, maka jawaban akhir kami, 301 00:22:10,060 --> 00:22:13,950 hanya melakukan menyapu linier di array subproblem 302 00:22:13,950 --> 00:22:19,890 dan mengambil jumlah maksimum. 303 00:22:19,890 --> 00:22:23,330 Ini merupakan implementasi yang tepat dari apa yang saya katakan. 304 00:22:23,330 --> 00:22:27,320 Jadi kita membuat array subproblem baru, submasalah. 305 00:22:27,320 --> 00:22:32,330 Entri pertama adalah 0 atau entri pertama, maksimal dua. 306 00:22:32,330 --> 00:22:35,670 Dan untuk sisa subproblem 307 00:22:35,670 --> 00:22:39,810 kita menggunakan kekambuhan yang tepat kita hanya menemukan. 308 00:22:39,810 --> 00:22:49,960 Sekarang kita menghitung maksimum array subproblem kami, dan itulah jawaban akhir kami. 309 00:22:49,960 --> 00:22:54,130 >> Jadi berapa banyak ruang yang kita gunakan dalam algoritma ini? 310 00:22:54,130 --> 00:23:01,470 Jika Anda hanya diambil CS50, maka Anda mungkin tidak dibahas ruang yang sangat banyak. 311 00:23:01,470 --> 00:23:07,750 Nah, satu hal yang perlu diperhatikan adalah bahwa aku menelepon malloc sini dengan n ukuran. 312 00:23:07,750 --> 00:23:13,590 Apa yang menyarankan kepada Anda? 313 00:23:13,590 --> 00:23:17,450 Algoritma ini menggunakan ruang linier. 314 00:23:17,450 --> 00:23:21,030 Bisakah kita berbuat lebih baik? 315 00:23:21,030 --> 00:23:30,780 Apakah ada sesuatu yang Anda perhatikan bahwa tidak perlu untuk menghitung jawaban akhir? 316 00:23:30,780 --> 00:23:33,290 Saya kira pertanyaan yang lebih baik adalah, informasi apa 317 00:23:33,290 --> 00:23:40,680 kita tidak perlu membawa semua jalan sampai akhir? 318 00:23:40,680 --> 00:23:44,280 Sekarang, jika kita melihat dua baris, 319 00:23:44,280 --> 00:23:47,720 kita hanya peduli tentang subproblem sebelumnya, 320 00:23:47,720 --> 00:23:50,910 dan kami hanya peduli tentang maksimum yang pernah kami lihat sejauh ini. 321 00:23:50,910 --> 00:23:53,610 Untuk menghitung jawaban akhir kami, kita tidak perlu seluruh array. 322 00:23:53,610 --> 00:23:57,450 Kita hanya perlu nomor terakhir, terakhir dua angka. 323 00:23:57,450 --> 00:24:02,630 Terakhir nomor array subproblem, dan nomor terakhir untuk maksimum. 324 00:24:02,630 --> 00:24:07,380 Jadi, pada kenyataannya, kita dapat sekering loop ini bersama-sama 325 00:24:07,380 --> 00:24:10,460 dan pergi dari ruang ke ruang linier konstan. 326 00:24:10,460 --> 00:24:15,830 Jumlah saat ini sejauh ini, di sini, menggantikan peran subproblem, array subproblem kami. 327 00:24:15,830 --> 00:24:20,020 Jadi jumlah saat ini, sejauh ini, adalah jawaban untuk subproblem sebelumnya. 328 00:24:20,020 --> 00:24:23,450 Dan jumlah itu, sejauh ini, mengambil tempat max kami. 329 00:24:23,450 --> 00:24:28,100 Kami menghitung maksimal seperti yang kita pergi bersama. 330 00:24:28,100 --> 00:24:30,890 Dan jadi kami pergi dari ruang ke ruang linier konstan, 331 00:24:30,890 --> 00:24:36,650 dan kami juga memiliki solusi untuk masalah linear subarray kami. 332 00:24:36,650 --> 00:24:40,740 >> Jenis pertanyaan Anda akan mendapatkan selama wawancara. 333 00:24:40,740 --> 00:24:44,450 Apa kompleksitas waktu, apa kompleksitas ruang? 334 00:24:44,450 --> 00:24:50,600 Dapatkah Anda berbuat lebih baik? Apakah ada hal-hal yang tidak perlu untuk menjaga sekitar? 335 00:24:50,600 --> 00:24:55,270 Saya melakukan ini untuk menyoroti analisis yang harus Anda ambil sendiri 336 00:24:55,270 --> 00:24:57,400 karena Anda bekerja melalui masalah ini. 337 00:24:57,400 --> 00:25:01,710 Selalu bertanya pada diri sendiri, "Dapatkah saya melakukan lebih baik?" 338 00:25:01,710 --> 00:25:07,800 Bahkan, bisa kita lakukan lebih baik daripada ini? 339 00:25:07,800 --> 00:25:10,730 Semacam pertanyaan jebakan. Anda tidak bisa, karena Anda perlu 340 00:25:10,730 --> 00:25:13,590 setidaknya membaca masukan untuk masalah ini. 341 00:25:13,590 --> 00:25:15,570 Jadi fakta bahwa Anda perlu setidaknya membaca masukan untuk masalah 342 00:25:15,570 --> 00:25:19,580 berarti bahwa Anda tidak dapat melakukan lebih baik dari waktu linier, 343 00:25:19,580 --> 00:25:22,870 dan Anda tidak dapat melakukan lebih baik daripada ruang konstan. 344 00:25:22,870 --> 00:25:27,060 Jadi ini adalah, pada kenyataannya, solusi terbaik untuk masalah ini. 345 00:25:27,060 --> 00:25:33,040 Pertanyaan? Oke. 346 00:25:33,040 --> 00:25:35,190 >> Pasar saham masalah: 347 00:25:35,190 --> 00:25:38,350 "Mengingat sebuah array bilangan bulat n, positif, nol, atau negatif, 348 00:25:38,350 --> 00:25:41,680 yang mewakili harga saham selama hari n, 349 00:25:41,680 --> 00:25:44,080 menulis fungsi untuk menghitung keuntungan maksimum Anda dapat membuat 350 00:25:44,080 --> 00:25:49,350 mengingat bahwa Anda membeli dan menjual saham dalam tepat 1 hari ini n. " 351 00:25:49,350 --> 00:25:51,690 Pada dasarnya, kami ingin membeli dengan harga rendah, menjual tinggi. 352 00:25:51,690 --> 00:25:58,580 Dan kami ingin mengetahui keuntungan terbaik yang kita bisa membuat. 353 00:25:58,580 --> 00:26:11,500 Kembali ke saya tip, apa jawaban, segera jelas sederhana, tapi itu lambat? 354 00:26:11,500 --> 00:26:17,690 Ya? (Mahasiswa, tidak dapat dimengerti) >> Ya. 355 00:26:17,690 --> 00:26:21,470 >> Jadi Anda hanya akan pergi meskipun dan melihat harga saham 356 00:26:21,470 --> 00:26:30,550 pada setiap titik waktu, (dipahami). 357 00:26:30,550 --> 00:26:33,990 [Yu] Oke, jadi solusi nya - sarannya komputasi 358 00:26:33,990 --> 00:26:37,380 yang terendah dan tertinggi komputasi tidak selalu bekerja 359 00:26:37,380 --> 00:26:42,470 karena tertinggi mungkin terjadi sebelum terendah. 360 00:26:42,470 --> 00:26:47,340 Jadi apa solusi brute force untuk masalah ini? 361 00:26:47,340 --> 00:26:53,150 Apa dua hal yang saya perlu unik menentukan keuntungan saya buat? Benar. 362 00:26:53,150 --> 00:26:59,410 Solusi kekerasan adalah - oh, jadi, saran George adalah kita hanya perlu dua hari 363 00:26:59,410 --> 00:27:02,880 untuk secara unik menentukan keuntungan dari dua hari. 364 00:27:02,880 --> 00:27:06,660 Jadi kita menghitung setiap pasangan, seperti membeli / menjual, 365 00:27:06,660 --> 00:27:12,850 menghitung keuntungan, yang bisa negatif atau positif atau nol. 366 00:27:12,850 --> 00:27:18,000 Hitung keuntungan maksimum yang kita buat setelah iterasi atas semua pasang hari. 367 00:27:18,000 --> 00:27:20,330 Itu akan menjadi jawaban akhir kami. 368 00:27:20,330 --> 00:27:25,730 Dan solusi yang akan menjadi O (n ^ 2), karena ada n memilih dua pasang - 369 00:27:25,730 --> 00:27:30,270 hari yang Anda dapat memilih di antara hari akhir. 370 00:27:30,270 --> 00:27:32,580 Oke, jadi aku tidak akan pergi ke solusi brute force di sini. 371 00:27:32,580 --> 00:27:37,420 Aku akan memberitahu Anda bahwa ada sebuah solusi log n n. 372 00:27:37,420 --> 00:27:45,550 Algoritma apa yang saat ini Anda tahu bahwa adalah n log n? 373 00:27:45,550 --> 00:27:50,730 Ini bukan pertanyaan jebakan. 374 00:27:50,730 --> 00:27:54,790 >> Merge sort. Merge sort adalah n log n, 375 00:27:54,790 --> 00:27:57,760 dan pada kenyataannya, salah satu cara untuk memecahkan masalah ini adalah dengan menggunakan 376 00:27:57,760 --> 00:28:04,400 semacam gabungan semacam ide yang disebut, secara umum, membagi dan menaklukkan. 377 00:28:04,400 --> 00:28:07,570 Dan idenya adalah sebagai berikut. 378 00:28:07,570 --> 00:28:12,400 Anda ingin menghitung pembelian terbaik / menjual pasangan di kiri setengah. 379 00:28:12,400 --> 00:28:16,480 Temukan keuntungan terbaik Anda dapat membuat, hanya dengan n pertama selama dua hari. 380 00:28:16,480 --> 00:28:19,780 Kemudian Anda ingin oompute pembelian terbaik / menjual pasangan di kanan setengah, 381 00:28:19,780 --> 00:28:23,930 sehingga n terakhir lebih dari dua hari. 382 00:28:23,930 --> 00:28:32,400 Dan sekarang pertanyaannya adalah, bagaimana kita menggabungkan solusi ini kembali bersama-sama? 383 00:28:32,400 --> 00:28:36,320 Ya? (Mahasiswa, tidak dapat dimengerti) 384 00:28:36,320 --> 00:28:49,890 Oke >>. Jadi biarkan aku menggambar. 385 00:28:49,890 --> 00:29:03,870 Ya? (George, tidak dapat dimengerti) 386 00:29:03,870 --> 00:29:06,450 >> Tepat. Solusi George yang tepat. 387 00:29:06,450 --> 00:29:10,040 Jadi sarannya adalah, pertama menghitung pasangan membeli / menjual yang terbaik, 388 00:29:10,040 --> 00:29:16,050 dan yang terjadi pada paruh kiri, jadi mari kita sebut bahwa kiri, kiri. 389 00:29:16,050 --> 00:29:20,790 Terbaik membeli / menjual pasangan yang terjadi di sisi kanan. 390 00:29:20,790 --> 00:29:25,180 Tetapi jika kita hanya membandingkan dua angka, kita kehilangan kasus 391 00:29:25,180 --> 00:29:30,460 di mana kita membeli dan menjual di sini di suatu tempat di sisi kanan. 392 00:29:30,460 --> 00:29:33,810 Kami membeli di kiri setengah, menjual di kanan setengah. 393 00:29:33,810 --> 00:29:38,490 Dan cara terbaik untuk menghitung pasangan membeli / menjual terbaik yang mencakup kedua bagian 394 00:29:38,490 --> 00:29:43,480 adalah untuk menghitung minimum di sini dan menghitung maksimal di sini 395 00:29:43,480 --> 00:29:45,580 dan mengambil perbedaan mereka. 396 00:29:45,580 --> 00:29:50,850 Jadi dua kasus di mana pasangan membeli / menjual terjadi hanya di sini, 397 00:29:50,850 --> 00:30:01,910 hanya di sini, atau di kedua bagiannya ditentukan oleh tiga angka. 398 00:30:01,910 --> 00:30:06,450 Jadi algoritma kami untuk menggabungkan solusi kami kembali bersama-sama, 399 00:30:06,450 --> 00:30:08,350 kita ingin menghitung pasangan membeli / menjual terbaik 400 00:30:08,350 --> 00:30:13,120 di mana kita membeli pada paruh kiri dan menjual di kanan setengah. 401 00:30:13,120 --> 00:30:16,740 Dan cara terbaik untuk melakukannya adalah untuk menghitung harga terendah di babak pertama, 402 00:30:16,740 --> 00:30:20,360 harga tertinggi di kanan setengah, dan mengambil perbedaan mereka. 403 00:30:20,360 --> 00:30:25,390 Tiga dihasilkan keuntungan, tiga angka, Anda mengambil maksimal tiga, 404 00:30:25,390 --> 00:30:32,720 dan itulah keuntungan terbaik Anda dapat membuat lebih dari hari-hari pertama dan akhir. 405 00:30:32,720 --> 00:30:36,940 Berikut garis penting adalah merah. 406 00:30:36,940 --> 00:30:41,160 Ini adalah panggilan rekursif untuk menghitung jawaban di kiri setengah. 407 00:30:41,160 --> 00:30:44,760 Ini adalah panggilan rekursif untuk menghitung jawaban di sisi kanan. 408 00:30:44,760 --> 00:30:50,720 Kedua untuk loop menghitung min dan max pada babak kiri dan kanan, masing-masing. 409 00:30:50,720 --> 00:30:54,970 Sekarang saya menghitung keuntungan yang mencakup kedua bagian, 410 00:30:54,970 --> 00:31:00,530 dan jawaban akhir adalah maksimal tiga. 411 00:31:00,530 --> 00:31:04,120 Oke. 412 00:31:04,120 --> 00:31:06,420 >> Jadi, tentu, kita memiliki sebuah algoritma, tapi pertanyaan besar adalah, 413 00:31:06,420 --> 00:31:08,290 apa kompleksitas waktu ini? 414 00:31:08,290 --> 00:31:16,190 Dan alasan mengapa saya sebutkan semacam gabungan adalah bahwa bentuk membagi jawabannya 415 00:31:16,190 --> 00:31:19,200 menjadi dua dan kemudian menggabungkan solusi kami kembali bersama-sama 416 00:31:19,200 --> 00:31:23,580 adalah persis bentuk gabungan semacam. 417 00:31:23,580 --> 00:31:33,360 Jadi biarkan aku pergi melalui durasi. 418 00:31:33,360 --> 00:31:41,340 Jika kita mendefinisikan fungsi t (n) menjadi jumlah langkah 419 00:31:41,340 --> 00:31:50,010 untuk hari n, 420 00:31:50,010 --> 00:31:54,350 kami dua rekursif panggilan 421 00:31:54,350 --> 00:32:00,460 masing-masing akan biaya t (n / 2), 422 00:32:00,460 --> 00:32:03,540 dan ada dua panggilan tersebut. 423 00:32:03,540 --> 00:32:10,020 Sekarang saya perlu untuk menghitung minimum kiri setengah, 424 00:32:10,020 --> 00:32:17,050 yang saya bisa lakukan dalam n / 2 waktu, ditambah maksimum kanan setengah. 425 00:32:17,050 --> 00:32:20,820 Jadi ini hanya n. 426 00:32:20,820 --> 00:32:25,050 Dan kemudian ditambah beberapa pekerjaan konstan. 427 00:32:25,050 --> 00:32:27,770 Dan persamaan kekambuhan 428 00:32:27,770 --> 00:32:35,560 adalah persis persamaan kambuh gabungan semacam. 429 00:32:35,560 --> 00:32:39,170 Dan kita semua tahu bahwa gabungan semacam adalah n log n waktu. 430 00:32:39,170 --> 00:32:46,880 Oleh karena itu, algoritma kami juga n log n waktu. 431 00:32:46,880 --> 00:32:52,220 Apakah iterasi ini masuk akal? 432 00:32:52,220 --> 00:32:55,780 Hanya rekap singkat ini: 433 00:32:55,780 --> 00:32:59,170 T (n) adalah sejumlah langkah untuk menghitung keuntungan yang maksimal 434 00:32:59,170 --> 00:33:02,750 selama hari n. 435 00:33:02,750 --> 00:33:06,010 Cara kita berpisah panggilan rekursif kami 436 00:33:06,010 --> 00:33:11,980 adalah dengan memanggil solusi kami pada hari n / 2 pertama, 437 00:33:11,980 --> 00:33:14,490 jadi itulah satu panggilan, 438 00:33:14,490 --> 00:33:16,940 dan kemudian kita sebut lagi pada babak kedua. 439 00:33:16,940 --> 00:33:20,440 Jadi itu dua panggilan. 440 00:33:20,440 --> 00:33:25,310 Dan kemudian kita menemukan minimal pada babak kiri, yang bisa kita lakukan dalam waktu linier, 441 00:33:25,310 --> 00:33:29,010 menemukan maksimum kanan setengah, yang bisa kita lakukan dalam waktu linear. 442 00:33:29,010 --> 00:33:31,570 Jadi n / 2 + n / 2 hanya n. 443 00:33:31,570 --> 00:33:36,020 Lalu kami memiliki beberapa pekerjaan yang konstan, yang seperti melakukan aritmatika. 444 00:33:36,020 --> 00:33:39,860 Persamaan ini kambuh adalah persis persamaan kambuh gabungan semacam. 445 00:33:39,860 --> 00:33:55,490 Oleh karena itu, algoritma shuffle kami juga n log n. 446 00:33:55,490 --> 00:33:58,520 Jadi berapa banyak ruang yang kita gunakan? 447 00:33:58,520 --> 00:34:04,910 Mari kita kembali ke kode. 448 00:34:04,910 --> 00:34:09,420 >> Sebuah pertanyaan yang lebih baik adalah, berapa banyak frame tumpukan yang kita pernah miliki pada saat tertentu? 449 00:34:09,420 --> 00:34:11,449 Karena kita menggunakan rekursi, 450 00:34:11,449 --> 00:34:23,530 jumlah frame tumpukan menentukan penggunaan ruang kami. 451 00:34:23,530 --> 00:34:29,440 Mari kita menganggap n = 8. 452 00:34:29,440 --> 00:34:36,889 Kami menyebutnya putar acak 8, 453 00:34:36,889 --> 00:34:41,580 yang akan memanggil mengocok pada empat entri pertama, 454 00:34:41,580 --> 00:34:46,250 yang akan memanggil shuffle pada dua entri pertama. 455 00:34:46,250 --> 00:34:51,550 Jadi tumpukan kami adalah - ini adalah tumpukan kami. 456 00:34:51,550 --> 00:34:54,980 Dan kemudian kita sebut mengocok lagi pada 1, 457 00:34:54,980 --> 00:34:58,070 dan itulah yang kasus dasar kita, sehingga kita kembali segera. 458 00:34:58,070 --> 00:35:04,700 Apakah kita pernah memiliki lebih dari ini frame tumpukan banyak? 459 00:35:04,700 --> 00:35:08,880 Tidak Karena setiap kali kita melakukan sebuah doa, 460 00:35:08,880 --> 00:35:10,770 pemanggilan rekursif untuk shuffle, 461 00:35:10,770 --> 00:35:13,950 kita membagi ukuran kami di setengah. 462 00:35:13,950 --> 00:35:17,020 Jadi jumlah maksimum stack frame yang pernah kita miliki pada saat tertentu 463 00:35:17,020 --> 00:35:28,460 berada di urutan frame log n tumpukan. 464 00:35:28,460 --> 00:35:42,460 Setiap stack frame memiliki ruang konstan, 465 00:35:42,460 --> 00:35:44,410 dan oleh karena itu jumlah total ruang, 466 00:35:44,410 --> 00:35:49,240 jumlah maksimum ruang yang pernah kita gunakan adalah O (log n) ruang 467 00:35:49,240 --> 00:36:03,040 di mana n adalah jumlah hari. 468 00:36:03,040 --> 00:36:07,230 >> Sekarang, selalu tanyakan pada diri sendiri, "Bisakah kita berbuat lebih baik?" 469 00:36:07,230 --> 00:36:12,390 Dan khususnya, kita bisa mengurangi ini untuk masalah kita sudah diselesaikan? 470 00:36:12,390 --> 00:36:20,040 Sebuah petunjuk: kita hanya membahas dua masalah lainnya sebelum ini, dan itu tidak akan mengocok. 471 00:36:20,040 --> 00:36:26,200 Kita dapat mengkonversi masalah pasar saham ke dalam masalah subarray maksimal. 472 00:36:26,200 --> 00:36:40,100 Bagaimana kita bisa melakukan ini? 473 00:36:40,100 --> 00:36:42,570 Salah satu dari Anda? Emmy? 474 00:36:42,570 --> 00:36:47,680 (Emmy, tidak dapat dimengerti) 475 00:36:47,680 --> 00:36:53,860 [Yu] Tepat. 476 00:36:53,860 --> 00:36:59,940 Jadi masalah subarray maksimal, 477 00:36:59,940 --> 00:37:10,610 kita mencari penjumlahan atas subarray terus menerus. 478 00:37:10,610 --> 00:37:16,230 Dan saran Emmy untuk masalah saham, 479 00:37:16,230 --> 00:37:30,720 mempertimbangkan perubahan, atau delta. 480 00:37:30,720 --> 00:37:37,440 Dan gambar ini adalah - ini adalah harga saham, 481 00:37:37,440 --> 00:37:42,610 tetapi jika kita mengambil perbedaan antara setiap hari berturut-turut - 482 00:37:42,610 --> 00:37:45,200 jadi kita melihat bahwa harga maksimum, keuntungan maksimum kita bisa membuat 483 00:37:45,200 --> 00:37:50,070 adalah jika kita membeli di sini dan menjual di sini. 484 00:37:50,070 --> 00:37:54,240 Tapi mari kita lihat terus menerus - mari kita lihat masalah subarray. 485 00:37:54,240 --> 00:38:02,510 Jadi di sini, kita dapat membuat - pergi dari sini ke sini, 486 00:38:02,510 --> 00:38:08,410 kita memiliki perubahan yang positif, dan kemudian pergi dari sini ke sini kita memiliki perubahan negatif. 487 00:38:08,410 --> 00:38:14,220 Tapi kemudian, pergi dari sini ke sini kita memiliki perubahan positif yang sangat besar. 488 00:38:14,220 --> 00:38:20,930 Dan ini adalah perubahan yang ingin kita meringkas untuk mendapatkan keuntungan yang akhir kami. 489 00:38:20,930 --> 00:38:25,160 Lalu kami memiliki lebih banyak perubahan negatif di sini. 490 00:38:25,160 --> 00:38:29,990 Kunci untuk mengurangi masalah stok kami ke masalah subarray maksimal kami 491 00:38:29,990 --> 00:38:36,630 adalah untuk mempertimbangkan delta antara hari. 492 00:38:36,630 --> 00:38:40,630 Jadi kita membuat array baru yang disebut delta, 493 00:38:40,630 --> 00:38:43,000 menginisialisasi pertama masuk menjadi 0, 494 00:38:43,000 --> 00:38:46,380 dan kemudian untuk setiap delta (i), membiarkan hal itu menjadi perbedaan 495 00:38:46,380 --> 00:38:52,830 dari saya masukan array (i), dan array (i - 1). 496 00:38:52,830 --> 00:38:55,530 Kemudian kita sebut prosedur rutin kami untuk subarray maksimal 497 00:38:55,530 --> 00:39:01,500 lewat di array delta itu. 498 00:39:01,500 --> 00:39:06,440 Dan karena subarray maksimal adalah waktu linier, 499 00:39:06,440 --> 00:39:09,370 dan ini pengurangan, ini proses menciptakan array delta, 500 00:39:09,370 --> 00:39:11,780 juga waktu linier, 501 00:39:11,780 --> 00:39:19,060 maka solusi akhir untuk saham adalah O (n) kerja ditambah O (n) pekerjaan, masih O (n) bekerja. 502 00:39:19,060 --> 00:39:23,900 Jadi kita memiliki solusi waktu linier untuk masalah kita. 503 00:39:23,900 --> 00:39:29,610 Apakah semua orang mengerti transformasi ini? 504 00:39:29,610 --> 00:39:32,140 >> Secara umum, ide yang baik bahwa Anda harus selalu memiliki 505 00:39:32,140 --> 00:39:34,290 adalah mencoba untuk mengurangi masalah baru yang Anda lihat. 506 00:39:34,290 --> 00:39:37,700 Jika tampak akrab bagi masalah lama, 507 00:39:37,700 --> 00:39:39,590 cobalah mengurangi ke masalah lama. 508 00:39:39,590 --> 00:39:41,950 Dan jika Anda dapat menggunakan semua alat yang Anda telah digunakan pada masalah lama 509 00:39:41,950 --> 00:39:46,450 untuk memecahkan masalah baru. 510 00:39:46,450 --> 00:39:49,010 Jadi untuk membungkus, wawancara teknis menantang. 511 00:39:49,010 --> 00:39:52,280 Masalah-masalah ini mungkin beberapa masalah yang lebih sulit 512 00:39:52,280 --> 00:39:54,700 yang mungkin Anda lihat dalam sebuah wawancara, 513 00:39:54,700 --> 00:39:57,690 jadi jika Anda tidak mengerti semua masalah yang saya hanya tertutup, tidak apa-apa. 514 00:39:57,690 --> 00:40:01,080 Ini adalah beberapa masalah yang lebih menantang. 515 00:40:01,080 --> 00:40:03,050 Latihan, latihan, latihan. 516 00:40:03,050 --> 00:40:08,170 Saya memberikan banyak masalah dalam handout, jadi pasti memeriksa mereka keluar. 517 00:40:08,170 --> 00:40:11,690 Dan good luck pada wawancara Anda. Semua sumber daya yang diposting di link ini, 518 00:40:11,690 --> 00:40:15,220 dan salah satu teman senior saya telah menawarkan untuk melakukan wawancara teknis tiruan, 519 00:40:15,220 --> 00:40:22,050 jadi jika Anda tertarik, email Will Yao pada alamat email. 520 00:40:22,050 --> 00:40:26,070 Jika Anda memiliki beberapa pertanyaan, Anda dapat bertanya kepada saya. 521 00:40:26,070 --> 00:40:28,780 Apakah kalian memiliki pertanyaan spesifik yang berhubungan dengan wawancara teknis 522 00:40:28,780 --> 00:40:38,440 atau masalah yang telah kita lihat sejauh ini? 523 00:40:38,440 --> 00:40:49,910 Oke. Nah, semoga sukses pada wawancara Anda. 524 00:40:49,910 --> 00:40:52,910 [CS50.TV]