[Powered by Google Translate] سمینار: مصاحبه فنی]
[کنی یو، دانشگاه هاروارد]
[این CS50.] [CS50.TV]
سلام به همگی، من کنی. من در حال حاضر تاریخ و زمان تحصیل در رشته علوم کامپیوتر است.
من سابق TF CS، و من آرزو می کنم که تا به حال زمانی که من شاگرد سالهای اول بود،
و به همین دلیل است که من به این سمینار است.
بنابراین من امیدوارم که شما از آن لذت ببرید.
این سمینار در مورد مصاحبه فنی،
و من تمام منابع را می توان در این لینک وجود،
این لینک در اینجا، زن و شوهر از منابع است.
بنابراین من یک لیست از مشکلات ساخته شده است، در واقع، کاملا چند مشکلات.
همچنین یک صفحه منابع عمومی که در آن ما می تواند راهنمایی
چگونه برای مصاحبه آماده،
راهنمایی در مورد آنچه که شما باید در طی یک مصاحبه واقعی انجام دهید،
و همچنین چگونگی برخورد با مشکلات و منابع به عنوان مرجع در آینده است.
این همه آنلاین.
و فقط به مقدمه این سمینار سلب مسئولیت
مانند این باید - آمادگی مصاحبه
باید به این لیست نمی شود.
این است که تنها به معنای به راهنمای،
و شما قطعا باید همه چیز من با یک دانه نمک می گویند،
اما همه چیز من استفاده می شود به شما در آماده سازی مصاحبه شما کمک کند استفاده کنید.
>> من قصد دارم به سرعت را از طریق چند اسلاید بعدی
بنابراین ما می توانیم به مطالعات موردی واقعی.
ساختار مصاحبه برای موقعیت مهندسی نرم افزار،
به طور معمول آن 30 تا 45 دقیقه است،
گلوله های متعدد، بسته به این شرکت است.
اغلب شما به برنامه نویسی روی یک تخته سفید.
بنابراین هیئت مدیره سفید شبیه به این، اما اغلب در مقیاس کوچکتر.
اگر شما با داشتن یک مصاحبه تلفنی، شما احتمالا می خواهید با استفاده از
یا collabedit یا یک Google Doc به طوری که آنها می توانید ببینید که شما زندگی می کنند برنامه نویسی
در حالی که شما از طریق تلفن مصاحبه شده است.
مصاحبه به خودی خود به طور معمول 2 یا 3 مشکلات
تست کامپیوتر دانش خود را علم.
و آن را تقریبا قطعا شامل برنامه نویسی.
نوع سوالات است که شما خواهید دید معمولا ساختارهای داده و الگوریتم های.
و در انجام این نوع از مشکلات،
آنها به شما، بپرسید که دوست دارید، زمان و پیچیدگی فضا، O بزرگ چیست؟
اغلب آنها نیز از سطح بالاتر سوالات،
بنابراین، طراحی یک سیستم،
چگونه می خواهید وضع از کد شما؟
چه واسط، کلاس های درس، چه ماژول های شما در سیستم شما را داشته باشد،
و چگونه با هم تعامل؟
بنابراین داده ساختارها و الگوریتم ها و همچنین طراحی سیستم.
>> برخی راهنمایی های عمومی قبل از ما در مطالعات موردی شیرجه رفتن.
من فکر می کنم مهم ترین قانون همیشه فکر کردن با صدای بلند.
این مصاحبه قرار است شانس خود را برای نشان دادن روند تفکر خود را.
از مصاحبه، برای مصاحبه به ارزیابی
چگونه فکر می کنید و چگونه شما را از طریق یک مشکل است.
بدترین کاری که می توانید انجام دهید این است سکوت در طول مصاحبه تمام است.
این تنها چیز خوبی نیست.
هنگامی که شما به یک سوال، شما همچنین می خواهم تا مطمئن شوید که شما را در درک سوال.
بنابراین این سوال را در کلمات خود را تکرار
و تلاش برای کار دقیق چند مورد آزمون ساده
مطمئن شوید که شما را در درک سوال.
کار را از طریق چند مورد آزمون نیز شما را شهود در مورد چگونه به حل این مشکل است.
شما حتی ممکن است به کشف الگوهای چند برای کمک به شما مشکل را حل کند.
نوک بزرگ خود نا امید شده است.
آیا می نا امید شده است.
مصاحبه به چالش کشیدن، اما بدترین کاری که می توانید انجام دهید،
علاوه بر به سکوت است، را به مریی نا امید.
شما نمی خواهید که احساس را به مصاحبه.
یک چیز که شما - بنابراین، بسیاری از مردم، زمانی که آنها را به یک مصاحبه،
آنها در تلاش برای سعی کنید بهترین راه حل برای پیدا کردن 1،
زمانی که واقعا، معمولا وجود دارد راه حل نکته به وضوح مشهود است.
این ممکن است آهسته باشد، ممکن است آن را ناکارآمد، اما شما فقط باید آن را دولت،
بنابراین شما یک نقطه شروع که از آن برای کار بهتر است.
همچنین، با اشاره به راه حل آهسته است، در شرایط
O بزرگ پیچیدگی زمان و یا پیچیدگی فضا،
نشان خواهد داد به مصاحبه است که شما را در درک
این مسائل در هنگام نوشتن کد.
پس نمی شود ترس آمد تا با ساده ترین الگوریتم اول
و سپس بهتر از آنجا کار می کنند.
هر گونه سؤال تا کنون؟ باشه.
>> بنابراین اجازه دهید به مشکل اول ما شیرجه رفتن.
"با توجه به آرایه ای از اعداد صحیح N، نوشتن یک تابع است که shuffles آرایه
در چنین مکانی است که تمام جایگشت از اعداد صحیح N هستند به همان اندازه احتمال دارد. "
و فرض شما در دسترس ژنراتور عدد صحیح تصادفی
که با تولید یک عدد صحیح در یک محدوده از 0 تا من، در محدوده 1/2 است.
آیا هر کس درک این سوال؟
من به شما یک آرایه از اعداد صحیح N را، و من می خواهم شما را به این سو و ان سو حرکت کردن آن است.
در دایرکتوری من، من نوشت: چند برنامه برای نشان دادن آنچه که منظور من است.
من قصد دارم به این سو و ان سو حرکت کردن مجموعه ای از 20 عنصر،
از -10 تا 9،
و من می خواهم شما را به خروجی یک لیست مثل این.
بنابراین این طبقه بندی شده آرایه ورودی من است، و من می خواهم شما را به این سو و ان سو حرکت کردن آن است.
ما دوباره آن را انجام دهد.
آیا هر کس درک سوال؟ باشه.
پس از آن تا به شما.
برخی از ایده ها چه هستند؟ آیا می توانم آن را به شما به عنوان N ^ 2، N ورود N، N؟
باز برای پیشنهاد.
باشه. بنابراین یک ایده، پیشنهاد شده توسط امی،
محاسبه عدد تصادفی، عدد صحیح تصادفی در یک محدوده از 0 تا 20 است.
بنابراین فرض کنیم آرایه ما به طول 20.
در نمودار ما از 20 عنصر،
این آرایه ورودی ما می باشد.
و در حال حاضر، پیشنهاد او این است که برای ایجاد یک آرایه جدید،
بنابراین این آرایه خروجی خواهد بود.
و در من های رند بازگشت بر اساس -
بنابراین اگر من بود، اجازه دهید می گویند، 17،
کپی عنصر 17 به مقام اول است.
در حال حاضر ما نیاز به حذف - ما نیاز به تغییر تمام عناصر در اینجا
بیش از به طوری که در حال حاضر یک شکاف در پایان و بدون سوراخ در وسط.
و در حال حاضر این روند را تکرار کنید.
در حال حاضر یک عدد صحیح تصادفی بین 0 و 19 را انتخاب کنید.
در حال حاضر من به جدید اینجا زا کلیک کنید، و ما را کپی کنید این عنصر را به این موقعیت است.
سپس مورد ما تغییر و بیش از ما به تکرار این روند تا زمانی که ما کامل آرایه جدید.
زمان اجرای این الگوریتم چیست؟
خوب، اجازه دهید در نظر گرفتن تاثیر از این.
ما در حال تغییر در هر عنصر است.
هنگامی که ما حذف این من، ما در حال انتقال تمام عناصر بعد از آن به سمت چپ.
و این هزینه O (n) است
زیرا در صورتی که عنصر اول را حذف کنیم؟
بنابراین برای هر حذف، را حذف کنیم -
هر یک از حذف متقبل عملیات O (N)،
و از آنجایی که ما نفر حذف، این منجر به این سو و ان سو حرکت کردن O (n ^ 2) است.
باشه. بنابراین شروع خوب است. شروع خوب است.
>> پیشنهاد دیگر این است که به استفاده از چیزی که شناخته شده به عنوان این سو و ان سو حرکت کردن کنوت،
این سو و ان سو حرکت کردن فیشر یاتس است.
و این در واقع یک سو و ان سو حرکت کردن زمان خطی است.
و این ایده بسیار مشابه است.
باز هم، ما باید آرایه ورودی ما،
اما به جای استفاده از دو آرایه ورودی / خروجی،
ما با استفاده از بخش اول از آرایه به پیگیری از ما بخش حوصلگی،
و مسیر ما را، و پس از آن بقیه از آرایه های ما ما را ترک برای بخش unshuffled.
بنابراین در اینجا چیزی است که من معنی می باشد. ما شروع کردن با - ما یک من را انتخاب کنید،
یک آرایه از 0 تا 20.
اشاره گر به ما این است که در حال حاضر با اشاره به شاخص اول است.
ما را انتخاب کنید در اینجا من
و در حال حاضر ما مبادله.
بنابراین اگر این 5 بود و این 4 سال بود،
آرایه حاصل خواهد شد 5 اینجا و 4 در اینجا داشته باشد.
و در حال حاضر ما توجه داشته باشید که نشانگر در اینجا.
همه چیز را به سمت چپ حوصلگی،
و همه چیز را به سمت راست unshuffled.
و در حال حاضر ما می توانیم این روند را تکرار کنید.
شاخص تصادفی بین 1 و 20 در حال حاضر ما را انتخاب کنید.
آنقدر جدید من در اینجا فرض کنید.
در حال حاضر من از این مبادله با موقعیت فعلی ما در اینجا.
بنابراین ما می توانم در یک مبادله به جلو و عقب مثل این.
اجازه دهید من را تا کد آن را بیشتر به بتن است.
ما با انتخاب خود را از من شروع -
ما شروع به با من برابر 0، J نوشته ها تصادفی انتخاب
در بخش unshuffled از آرایه، من تا n-1 است.
پس اگر من اینجا هستم، انتخاب شاخص تصادفی بین اینجا و بقیه از آرایه،
و ما مبادله.
تمام کد های لازم را به این سو و ان سو حرکت کردن آرایه شما می باشد.
هر گونه سؤال؟
>> خب، یک سوال مورد نیاز است، به همین دلیل این درست است؟
چرا هر جایگشت به همان اندازه احتمال دارد؟
و من نمی خواهد رفتن را از طریق اثبات این،
اما بسیاری از مشکلات در علوم کامپیوتر را می توان از طریق القای اثبات رسیده است.
چگونه بسیاری از شما آشنا هستند با القای؟
باشه. دانلود.
بنابراین شما می توانید صحت این الگوریتم توسط القاء ساده به اثبات برساند،
که در آن فرض استقراء شما خواهد بود، فرض کنیم که
این سو و ان سو حرکت کردن من برمی گرداند هر جایگشت به همان اندازه احتمال
تا عناصر من برای اولین بار.
در حال حاضر، در نظر من + 1.
و راه ما را انتخاب کنید J شاخص ما به مبادله،
این منجر به - و سپس شما را از جزئیات،
حداقل یک اثبات کامل که چرا این الگوریتم می گرداند
هر جایگشت با احتمال به همان اندازه احتمال دارد.
>> تمامی حقوق، مشکل بعدی.
پس "با توجه به آرایه ای از اعداد صحیح، postive، صفر، منفی،
ارسال یک تابع است که محاسبه مجموع حداکثر
آرایه ورودی است. هر subarray continueous "
به عنوان مثال در اینجا این است، در مورد که در آن تمام اعداد مثبت هستند،
پس از آن در حال حاضر بهترین انتخاب این است که کل آرایه.
1، 2، 3، 4، برابر است با 10.
هنگامی که شما برخی منفی در آن وجود دارد،
در این مورد، ما فقط می خواهم دو
دلیل انتخاب -1 و / -3 جمع ما را پایین بیاورد.
گاهی اوقات ما ممکن است در وسط آرایه شروع.
گاهی اوقات ما می خواهیم را انتخاب کنید هیچ چیز در همه، آن را به هر چیزی نمی کنند.
و گاهی اوقات بهتر است را به سقوط،
زیرا چیزی که پس از آن فوق العاده بزرگ است. بنابراین هر گونه ایده ها؟
(دانش آموز، ناخوانا) >> آره.
فرض کنید من را نمی -1.
سپس هر دو را انتخاب می کنم 1000 و 20،000،
و یا من فقط 3 میلیارد را انتخاب کنید.
خوب، بهترین انتخاب این است که تمام اعداد است.
این با وجود منفی بودن، -1،
مجموع کل بهتر از بود من نمی -1.
بنابراین یکی از راهنمایی من که قبلا ذکر شد به دولت آشکار به وضوح
و راه حل نیروی بی رحم برای اولین بار.
راه حل نیروی بی رحم در این مساله چیست؟ آره؟
[جین] خب، من فکر می کنم راه حل نیروی بی رحم
خواهد بود به اضافه کردن تمام ترکیبات ممکن (ناخوانا).
[یو] باشه. بنابراین ایده جین این است که هر ممکن -
من تکرار گفتار هستم - را به هر subarray ممکن است مداوم،
محاسبه مجموع آن، و سپس حداکثر از همه subarrays مداوم.
شناسایی منحصر به فرد subarray در آرایه ورودی من؟
می شود، چه دو چیز نیاز دارم؟ آره؟
(دانش آموز، ناخوانا) راست. >>
پایین بر روی شاخص و شاخص حد بالا محدود
منحصر به فرد تعیین مداوم subarray.
[دختر دانش] ما برآورد آن را به یک آرایه از اعداد منحصر به فرد است؟
[یو] شماره بنابراین سوال او است، ما فرض آرایه ما -
آرایه ما همه شماره منحصر به فرد است، و پاسخ این است که هیچ.
>> اگر راه حل نیروی حیوان، پس از آن استفاده از شاخص شروع / پایان ما
منحصر به فرد تعیین subarray مداوم ما است.
بنابراین اگر ما در تمام نوشته های آغاز ممکن است تکرار،
و برای تمام نوشته های پایان> یا = برای شروع، و <N،
محاسبه مجموع، و سپس حداکثر مجموع ما تا کنون دیده ایم ما را.
آیا این روشن است؟
O بزرگ از این راه حل چیست؟
Timewise.
نه کاملا ^ 2 نفر شده است.
توجه داشته باشید که ما از 0 تا n تکرار،
به طوری که یک حلقه for است.
ما تکرار دوباره تقریبا از آغاز تا پایان، یکی دیگر از حلقه.
و در حال حاضر، که در آن، ما مجبور به خلاصه کردن هر ورود،
به طوری که یکی دیگر از حلقه. بنابراین ما باید تو در تو حلقه for، N ^ 3.
باشه. این می رود به عنوان یک نقطه شروع است.
راه حل ما این است که هیچ بدتر از N ^ 3 است.
آیا هر کس درک راه حل نیروی بی رحم؟
>> باشه. یک راه حل بهتر است با استفاده از یک ایده به نام برنامه نویسی پویا است.
اگر شما را CS124، الگوریتم و ساختمان داده است،
شما تبدیل خواهد شد بسیار آشنا با این روش است.
و این ایده، تلاش برای ساخت راه حل به مشکلات کوچکتر برای اولین بار.
چیزی که من با این، ما در حال حاضر باید به در حدود دو چیز نگران: شروع و پایان.
و این آزار دهنده است. چه اگر ما می تواند از یکی از این پارامترها خلاص شدن از شر؟
یک ایده این است که - we're با توجه به مشکل اصلی ما،
پیدا کردن مجموع حداکثر هر subarray در محدوده [O، N-1].
و در حال حاضر ما زیر مسئله جدید، جایی که ما می دانیم، در شاخص فعلی ما،
ما می دانیم که ما باید نتیجه بگیریم. subarray ما باید در فهرست جاری به پایان برسد.
بنابراین مشکل باقی مانده است، که در آن باید subarray ما شروع کنیم؟
آیا این را حس؟ باشه.
بنابراین من رمزی این، و اجازه دهید نگاهی به این بدان معنی است.
در codirectory، برنامه ای به نام subarray وجود دارد،
و آن طول می کشد تعدادی از آیتم ها،
آن را می گرداند و حداکثر مجموع subarray در فهرست خورده است.
بنابراین در این حالت، حداکثر subarray ما 3 است.
و آن را با تنها با استفاده از 2 و 1 گرفته شده است.
بیایید دوباره آن را اجرا کنید. این هم 3.
اما این بار، توجه داشته باشید که ما چگونه در 3.
ما در زمان - ما فقط از 3 خود
چرا که آن را منفی در هر دو طرف احاطه شده است،
که در مجموع به ارمغان خواهد آورد <3.
اجازه اجرا بر روی 10 مورد.
این بار 7، ما پیشرو را در 3 و 4.
این زمان آن را 8، و این که به دست آوردن ما با در نظر گرفتن 1، 4 و 3.
بنابراین به شما شهود چگونه ما می توانیم این مشکل تبدیل شده را حل کند،
اجازه دهید نگاهی به این subarray.
ما با توجه به این آرایه ورودی است، و ما می دانیم پاسخ این است 8.
ما را به 1، 4، و 3.
اما اجازه دهید نگاهی به چگونه ما در واقع آن پاسخ.
اجازه دهید نگاهی به subarray حداکثر است که در هر یک از این شاخص ها به پایان رسید.
چه خبر، حداکثر subarray است که در مقام اول تا؟
[دانشجو] صفر. >> صفر. فقط -5 نمی کنند.
در اینجا آن را برای رفتن به 0 و همچنین. آره؟
(دانش آموز، ناخوانا)
یو] اوه، ببخشید، آن است که -3.
پس این است که به 2، این -3 است.
باشه. بنابراین -4، چه subarray حداکثر برای پایان دادن به آن موقعیت
که در آن -4 است؟ صفر.
یکی؟ 1، 5، 8.
در حال حاضر، من باید در محل -2 در پایان.
بنابراین 6، 5، 7، و یکی از آخرین 4 است.
آگاهی از این که این نوشته های من
برای مشکل تبدیل شده است که در آن من باید در هر یک از این شاخص به پایان،
سپس پاسخ نهایی من این است که تنها، رفت و برگشت را در سراسر
و حداکثر تعداد.
بنابراین در این مورد 8.
این حاکی از آن است که subarray حداکثر به پایان می رسد در این شاخص،
و در جایی قبل از آن آغاز شده است.
آیا هر کس درک این subarray تبدیل شده؟
>> باشه. خوب، اجازه دهید شکل از عود.
بیایید در نظر گرفتن فقط نوشته های چند.
بنابراین در اینجا آن را 0، 0، 0، 1، 5، 8.
و سپس -2 بود در اینجا وجود دارد، و آن را پایین آورده تا 6.
بنابراین اگر من به ورود در موقعیت زیر مسئله (من)،
چگونه می توان جواب من به یک زیر مسئله قبلی
برای پاسخ به این زیر مسئله است؟
اگر من نگاه کنید، اجازه دهید می گویند، این مطلب است.
چگونه می توان پاسخ 6 محاسبه شده توسط به دنبال در
ترکیبی از این آرایه و پاسخ های به زیر مسئله قبلی در این آرایه؟ بله؟
[دختر دانش] شما را به مجموعه ای از مبالغ
در سمت راست قبل از آن، پس از 8،
و پس از آن زیر مسئله فعلی شما اضافه کنید.
یو] بنابراین پیشنهاد او این است که در این دو عدد را نگاه کنید،
این عدد و این عدد است.
بنابراین این 8 اشاره به پاسخ برای زیر مسئله (I - 1).
و اجازه دهید با ورودی آرایه A. من تماس بگیرید
به منظور پیدا کردن subarray حداکثر که در موقعیت من به پایان می رسد،
من دو انتخاب است: من هم می تواند ادامه subarray
که در شاخص های قبلی به پایان رسید، و یا شروع یک آرایه جدید.
اگر من به ادامه subarray آغاز شده است که در شاخص های قبلی،
سپس مجموع حداکثر می تواند دستیابی به پاسخ به زیر مسئله قبلی است
به علاوه ورود آرایه.
اما، من نیز انتخاب شروع subarray جدید،
که در این صورت مجموع 0 است.
1، به علاوه ورود آرایه - پس از پاسخ، من در زیر مسئله حداکثر از 0 است.
آیا این عود را حس؟
عود ما، که ما فقط این موضوع را کشف کرد، از زیر مسئله من است
برابر است با به حداکثر از زیر مسئله قبلی به علاوه ورود آرایه،
که به معنی ادامه subarray قبلی،
0 یا شروع یک subarray جدید در شاخص فعلی من است.
و زمانی که ما ساخته شده است تا این جدول از راه حل، و سپس پاسخ نهایی ما،
فقط یک رفت و برگشت خطی در سراسر آرایه زیر مسئله انجام دهد
و حداکثر تعداد.
این یک اجرای دقیق آن از آنچه که من فقط گفت است.
بنابراین یک آرایه زیر مسئله جدید، زیر مسئله ایجاد می کنیم.
اولین ورودی یا 0 یا ورود به اول، حداکثر از آن دو است.
و برای بقیه از زیر مسئله ها
ما از عود دقیق ما فقط کشف.
در حال حاضر حداکثر از آرایه زیر مسئله ما را محاسبه و که پاسخ نهایی ما است.
>> پس چقدر فضای ما در این الگوریتم با استفاده از؟
اگر شما فقط گرفته CS50، و سپس شما ممکن است مورد بحث قرار نمی فضای بسیار زیاد شده است.
خب، یک چیز را به یاد داشته باشید این است که من به نام malloc در اینجا با N اندازه.
چه که به شما نشان می دهد؟
این الگوریتم با استفاده از فضای خطی است.
می تواند بهتر انجام دهید؟
آیا هر چیزی را که شما متوجه غیر ضروری است که به محاسبه جواب نهایی وجود دارد؟
من حدس می زنم یک سوال بهتر است، چه اطلاعات
ما لازم نیست که تمام راه را تا پایان ادامه می دهند؟
در حال حاضر، اگر ما در این دو خط را نگاه کنید،
ما فقط در مورد مراقبت از زیر مسئله قبلی
و ما تنها در مورد مراقبت از حداکثر ما تا کنون دیده ام تا کنون.
برای محاسبه جواب نهایی ما، ما نمی توانیم کل آرایه نیاز نیست.
ما فقط نیاز به شماره گذشته، دو شماره گذشته.
برای آرایه زیر مسئله، و عدد آخر برای حداکثر.
بنابراین، در واقع، ما می توانیم این حلقه ها را با هم ترکیب کنیم
بروید و از فضای خطی به فضای ثابت.
مجموع جاری تا کنون، در اینجا، جایگزین نقش از زیر مسئله، آرایه زیر مسئله ما است.
بنابراین در حال حاضر مجموع، تا کنون، پاسخ به زیر مسئله قبلی است.
و این مبلغ، تا کنون، حداکثر طول می کشد.
ما محاسبه حداکثر به عنوان ما به همراه.
و بنابراین ما از فضای خطی به فضای ثابت،
و ما نیز راه حل خطی مشکل subarray ما.
>> این نوع از سوالات شما در طی یک مصاحبه.
چه پیچیدگی زمانی پیچیدگی فضایی چه چیزی است؟
آیا می توانم بهتر از شما انجام دهد؟ آیا چیزهایی که غیر ضروری برای حفظ در اطراف وجود دارد؟
من این را به برجسته تجزیه و تحلیل است که شما باید در را آن گونه که مایلید تغییر دهید
که شما در حال کار را از طریق این مشکلات است.
همیشه پرسیدن از خود، "می توانم انجام دهم بهتر است؟"
در واقع، می تواند ما را بهتر از این؟
مرتب کردن بر اساس سوال ترفند. شما نمی توانید دلیل این که شما نیاز به
حداقل به عنوان خوانده شده ورودی برای این مشکل است.
بنابراین این واقعیت است که شما نیاز به حداقل خواندن ورودی به مشکل
این بدان معنی است که شما می توانید انجام دهید بهتر از زمان خطی،
و شما نمی توانید بهتر از فضای ثابت.
پس این است که، در واقع، بهترین راه حل برای این مشکل است.
پرسش و پاسخ؟ باشه.
>> مشکل بازار سهام:
"با توجه به آرایه ای از اعداد صحیح N، مثبت، صفر یا منفی،
است که نشان دهنده قیمت سهام در طول روز N
ارسال یک تابع حداکثر سود شما می توانید برای محاسبه
با توجه به این که شما در خرید و فروش دقیقا 1 سهام در این روزها N است. "
اساسا، ما می خواهیم به خرید پایین، فروش بالا.
و ما می خواهیم به شکل بهترین سود ما می توانیم.
بازگشت به نوک من، چه بلافاصله روشن، ساده ترین پاسخ است، اما آن را آهسته؟
بله؟ (دانش آموز، ناخوانا) >> بله.
>> بنابراین شما فقط می گرچه بروید و نگاهی به قیمت سهام
در هر نقطه در زمان، (نامفهوم).
[یو] خوب، به طوری که راه حل خود را - پیشنهاد خود را از محاسبات
کمترین و محاسبه بالاترین لزوما به کار
به دلیل اینکه بالاترین ممکن است قبل از کمترین رخ می دهد.
پس چه راه حل نیروی بی رحم برای این مشکل؟
دو چیز است که من باید منحصر به فرد تعیین سود من را چه هستند؟ راست.
راه حل نیروی بی رحم است - آه، پس، پیشنهاد جورج است که ما فقط نیاز به دو روز
منحصر به فرد سود از آن دو روز را تعیین کنید.
بنابراین هر جفت محاسبه ما، مانند خرید / فروش
محاسبه سود، که می تواند منفی یا مثبت است یا صفر.
محاسبه سود حداکثر است که ما پس از تکرار بیش از همه جفت از روز را.
پاسخ نهایی ما خواهد بود.
و این راه حل خواهد بود O (n ^ 2)، به دلیل وجود دارد N را انتخاب کنید از دو جفت -
روز را که شما می توانید در میان روز پایان را انتخاب کنید.
خوب، بنابراین من قصد دارم به بیش از راه حل زور به اینجا بروید.
من قصد دارم به شما بگویم که ورود N N راه حل وجود دارد.
چه الگوریتم آیا شما در حال حاضر می دانیم که N ورود N؟
این ترفند نیست.
>> ادغام مرتب سازی بر اساس. ادغام مرتب کردن بر اساس n log n استفاده شده است،
و در واقع، یکی از راه های حل این مشکل این است که استفاده از
نوع مرتب کردن بر اساس ایده ادغام نامیده می شود، به طور کلی، تقسیم و حل.
و ایده این است که به شرح زیر است.
شما می خواهید برای محاسبه بهترین خرید / فروش جفت در نیمه سمت چپ.
یافتن بهترین سود شما می توانید فقط با N برای اولین بار بیش از دو روز است.
سپس شما می خواهید به oompute بهترین خرید / فروش جفت در نیمه سمت راست،
به طوری که N گذشته به بیش از دو روز است.
و حالا سوال این است که، چگونه این راه حل، ما ادغام با هم؟
بله؟ (دانش آموز، ناخوانا)
>> درست است. بنابراین تصویر جلب کنیم.
بله؟ (جورج، ناخوانا)
>> دقیقا. راه حل جورج دقیقا درست است.
بنابراین پیشنهاد او این است، و برای اولین بار بهترین خرید / فروش محاسبه جفت،
و رخ می دهد که در نیمه سمت چپ، بنابراین تماس بگیرید که چپ، اجازه دهید.
بهترین خرید / فروش جفت رخ می دهد که در نیمه سمت راست است.
اما اگر ما فقط به مقایسه این دو عدد، ما در حال از دست رفته مورد
که در آن ما خرید و فروش جایی در نیمه سمت راست.
ما در نیمه سمت چپ خرید، در نیمه سمت راست را به فروش برساند.
و بهترین راه برای محاسبه بهترین خرید / فروش جفت است که شامل هر دو نیمه
برای محاسبه حداقل در اینجا و برای محاسبه حداکثر اینجا را کلیک کنید
و تفاوت آنها را.
بنابراین دو مورد که در آن جفت خرید / فروش فقط در اینجا رخ می دهد،
فقط در اینجا، و یا در هر دو نیمه با این سه عدد تعریف شده است.
بنابراین الگوریتم ما به ادغام راه حل های ما با هم،
ما می خواهیم برای محاسبه بهترین خرید / فروش جفت
جایی که ما در نیمه سمت چپ خرید و فروش در نیمه راست.
و بهترین راه برای انجام این کار این است که برای محاسبه پایین ترین قیمت در نیمه اول،
بالاترین قیمت در نیمه سمت راست، و اختلاف آنها.
سه نتیجه سود، این سه عدد، شما را حداکثر از سه،
و این که بهترین سود است که شما می توانید بیش از این روز اول و پایان است.
در اینجا خطوط مهم به رنگ قرمز هستند.
این یک تماس بازگشتی برای محاسبه پاسخ در نیمه سمت چپ است.
این یک تماس بازگشتی برای محاسبه پاسخ در نیمه سمت راست است.
این دو حلقه در محاسبه دقیقه و حداکثر در نیمه چپ و راست بود.
در حال حاضر سود است که دهانه هر دو نیمه محاسبه من،
و جواب نهایی حداکثر از این سه است.
باشه.
>> بنابراین، مطمئنا، ما یک الگوریتم، اما سوال بزرگتر است،
چه چیزی است پیچیدگی زمان از این؟
و به همین دلیل اشاره کردم مرتب سازی بر ادغام این است که این شکل از تقسیم پاسخ
به دو و سپس ادغام راه حل های ما با هم
دقیقا به شکل مرتب کردن بر اساس ادغام است.
پس اجازه دهید من از طریق مدت زمان.
اگر ما تعریف تابع T (n) به تعداد مراحل
برای روز N،
ما دو بازگشتی تماس
هر رفتن به هزینه T (n / 2)،
و دو نفر از این تماس وجود دارد.
حالا من نیاز به محاسبه حداقل در نیمه چپ،
که من می توانم در N / 2 زمان، به علاوه حداکثر از نیمه راست را انجام دهد.
بنابراین این فقط ازت.
و پس از آن به علاوه برخی از کار ثابت است.
و این معادله عود
دقیقا معادله عود مرتب سازی بر اساس ادغام است.
و همه ما می دانیم که مرتب سازی بر اساس ادغام ورود N N زمان است.
بنابراین، الگوریتم ما این است که n log n استفاده زمان.
آیا این تکرار را حس؟
فقط یک روکش مختصری از این:
T (n) تعداد مراحل به محاسبه حداکثر سود است
در طول این دوره از روز N.
راه ما تقسیم کردن تماس های بازگشتی ما
خواستار راه حل ما بر روی N / 2 روز اول،
به طوری که یک تماس،
و پس از آن ما تماس بگیرید دوباره در نیمه دوم.
به طوری که دو تماس است.
و پس از آن ما حداقل در نیمه چپ، که ما می توانیم در زمان خطی،
پیدا کردن حداکثر از نیمه راست، که ما می توانیم در زمان خطی انجام دهد.
بنابراین N / 2 + N / 2 فقط N است.
پس ما می توانیم برخی از کار ثابت، است که مانند انجام حسابی.
این معادله عود دقیقا معادله عود مرتب سازی بر اساس ادغام است.
از این رو، الگوریتم این سو و ان سو حرکت کردن ما نیز n log n استفاده است.
پس چقدر فضای ما استفاده می کنید؟
بازگشت به کد.
>> سوال بهتر است، که چگونه بسیاری از قاب پشته ما تا به حال در هر لحظه داشته باشد؟
از آنجا که ما در حال استفاده از بازگشت،
تعدادی از قاب های پشته تعیین فضای استفاده ما است.
بیایید در نظر N = 8.
ما به این سو و ان سو حرکت کردن در 8،
که به این سو و ان سو حرکت کردن را در چهار ورودی های تماس،
که به این سو و ان سو حرکت کردن در دو مورد اول ورودی های تماس بگیرید.
پس پشته ما است - این است که پشته ما است.
و پس از آن ما تماس بگیرید این سو و ان سو حرکت کردن دوباره در تاریخ 1،
و این چیزی است که مورد پایگاه ما است، بنابراین ما بلافاصله بازگشت.
آیا ما تا به حال بیش از این بسیاری از قاب پشته؟
نه از آنجا که هر یک از ما در یک نیایش،
نیایش بازگشتی به این سو و ان سو حرکت کردن،
ما تقسیم اندازه ما در نیم.
بنابراین حداکثر تعداد فریم پشته ما تا به حال در هر لحظه
منظور از ورود N فریم پشته.
هر قاب پشته فضای ثابت،
و در نتیجه مقدار کل فضا،
مقدار حداکثر از فضا ما تا به حال با استفاده از O (log n است) فضا است
که در آن N تعداد روز است.
>> در حال حاضر، همیشه از خودتان بپرسید، "آیا می توانیم بهتر انجام؟"
و به ویژه، می تواند این کار ما را کاهش می دهد به یک مشکلی که ما در حال حاضر حل شده؟
تذکر: ما تنها دو مشکل دیگر پیش از این بحث شد، و آن را به این سو و ان سو حرکت کردن.
ما می توانیم از این مشکل بازار سهام را به حداکثر مشکل subarray تبدیل کنید.
چگونه می توانید این کار می کنیم؟
یکی از شما؟ امی؟
(امی، ناخوانا)
[یو] دقیقا.
پس مشکل حداکثر subarray،
ما به دنبال مجموع بیش از یک subarray پیوسته است.
و پیشنهاد امی برای حل مشکل سهام،
در نظر گرفتن این تغییرات، یا دلتا.
و یک عکس از این است - این است که قیمت سهام،
اما اگر ما در زمان تفاوت بین هر روز پشت سر هم -
پس ما می بینیم که قیمت حداکثر، حداکثر سود ما می توانیم
اگر اینجا ما خرید و فروش در اینجا.
اما اجازه دهید نگاهی مداوم - اجازه دهید نگاهی به مشکل subarray.
بنابراین در اینجا، ما می توانیم - رفتن از اینجا به اینجا،
ما باید یک تغییر مثبت است، و پس از آن رفتن از اینجا به اینجا ما به تغییر منفی است.
اما پس از آن، رفتن از اینجا تا اینجا ما باید یک تغییر مثبت بزرگ می باشد.
و این تغییرات است که ما می خواهیم به طور خلاصه سود نهایی ما برای به دست آوردن.
پس ما می توانیم تغییرات منفی در اینجا.
کلیدی برای کاهش مشکل سهام ما را به مشکل subarray ما حداکثر
در نظر گرفتن دلتا بین روز است.
بنابراین یک آرایه جدید به نام دلتا ایجاد می کنیم،
مقداردهی اولیه ورود اولین بار به 0 باشد،
و پس از آن برای هر دلتا (I)، اجازه می دهد که تفاوت
آرایه ورودی من (من)، و آرایه (I - 1).
سپس ما فراخوانی روال معمول خود را برای subarray حداکثر
عبور در آرایه دلتا.
و چون subarray حداکثر زمان خطی است،
و این کاهش، این روند از ایجاد این آرایه دلتا،
همچنین زمان خطی،
سپس راه حل نهایی برای سهام O (N) کار علاوه O (N) کار است، هنوز هم O (N) کار است.
بنابراین ما باید یک راه حل زمان خطی به مشکل ما.
آیا هر کس درک این تحول است؟
>> به طور کلی، یک ایده خوب این است که شما همیشه باید
است سعی کنید یک مشکل جدید است که شما در حال دیدن به کاهش است.
اگر به نظر می رسد به یک مشکل قدیمی آشنا،
سعی کنید کاهش آن به یک مشکل قدیمی است.
و اگر شما می توانید به تمامی ابزار هایی که شما با مشکل قدیمی استفاده می شود استفاده کنید
برای حل این مشکل جدید.
بنابراین به بسته بندی کردن، مصاحبه فنی چالش برانگیز است.
این مشکلات احتمالا برخی از مشکلات مشکل تر
که شما ممکن است در یک مصاحبه،
بنابراین اگر شما تمام مشکلاتی که من فقط پوشش داده شده را درک نمی کنند، این درست است.
این ها برخی از مشکلات بیشتر به چالش کشیدن.
تمرین، تمرین، تمرین.
من به بسیاری از مشکلات در جزوه، پس قطعا بررسی آن است.
و خوب شانس در مصاحبه های خود است. تمام منابع من در این لینک نوشته شده است،
و یکی از دوستان ارشد من پیشنهاد کرده است برای انجام مصاحبه های ساختگی فنی،
بنابراین اگر شما علاقه مند هستید، ایمیل یائو که در آن آدرس ایمیل.
در صورتی که برخی از سوال، شما می توانید از من بپرسید.
آیا شما بچه ها سوالات خاص مربوط به مصاحبه فنی
هر گونه مشکلی که ما تا کنون دیده ایم؟
باشه. خب، خوب شانس در مصاحبه های خود.
[CS50.TV]