SPEAKER 1: راست است، بنابراین ما می باشد. به CS50 خوش آمدید. این پایان هفته هفت است. به طوری که زمان گذشته به خاطر بیاورید، ما شروع به دنبال کمی پیچیده تر ساختار دادهها. از آنجا که تا به حال، همه ما تا به حال واقعا در اختیار ما این آرایه بود. اما قبل از اینکه ما آرایه به عنوان دور انداختن همه که جالب توجه است، که در واقع آن را در واقع، آنچه که برخی از علامت + از این داده ها ساده ساختار تا کنون؟ آن را خوب در چیست؟ تا آنجا که ما دیده ایم؟ چه چیزی شما را؟ هیچ چیز. دانشجو: [نامفهوم]. SPEAKER 1: این چیه؟ دانشجو: [نامفهوم]. SPEAKER 1: اندازه ثابت. خوب، پس چرا اندازه ثابت هر چند خوب است؟ دانشجو: [نامفهوم]. SPEAKER 1: خوب، پس از آن کارآمد در به این معنا که شما می توانید اختصاص مقدار ثابت از فضا، که امیدوارم دقیقا به همان اندازه فضا به عنوان شما می خواهید. به طوری که می تواند کاملا به علاوه. یکی دیگر از سمت بالا یک آرایه چه خبر؟ آره؟ دانشجو: [نامفهوم]. SPEAKER: 1 - با عرض پوزش؟ دانشجو: [نامفهوم]. SPEAKER 1: همه جعبه در حافظه و یا در کنار یکدیگر. و این که مفید - چرا؟ این کاملا درست است. اما چگونه می توان آن حقیقت ما بهره برداری؟ دانشجو: [نامفهوم]. SPEAKER 1: دقیقا، ما می توانید پیگیری که در آن همه چیز فقط با دانستن یک آدرس، یعنی آدرس اولین بایت آن تکه از حافظه است. و یا در مورد رشته، آدرس اول کاراکتر در آن رشته است. و از آنجا، ما می توانید پیدا کنید پایان رشته است. ما می توانیم عنصر دوم، عنصر سوم، و غیره. و به این ترتیب راه فانتزی از توصیف این است که از ویژگی های است که آرایه به ما بدهد با دسترسی تصادفی است. فقط با استفاده از براکت مربع نماد و یک عدد باشد، شما می توانید پرش به یک عنصر خاص در آرایه در زمان ثابت، O بزرگ یک، پس به صحبت می کنند. اما برخی از جنبه های منفی وجود دارد بوده است. چه آرایه انجام دهید نه به راحتی؟ آنچه در آن خوب نیست؟ دانشجو: [نامفهوم]. SPEAKER 1: این چیه؟ دانشجو: [نامفهوم]. SPEAKER 1: گسترش در اندازه. بنابراین جنبه های منفی از آرایه دقیقا در مقابل از آنچه شاهد رشد آمارهای هستند. بنابراین یکی از جنبه های منفی است که آن را به یک اندازه ثابت. بنابراین شما واقعا می تواند در آن رشد کند. شما می توانید یک تکه بزرگتر از دوباره اختصاص حافظه، و سپس حرکت عناصر قدیمی به آرایه جدید. و سپس آرایه های قدیمی، برای به عنوان مثال، با استفاده از malloc و یا مشابه بازتخصیص تابع نامیده می شود، که حافظه reallocates. بازتخصیص، به عنوان یک کنار، تلاش می کند تا به شما بدهد حافظه ای که در آینده به آرایه که شما در حال حاضر. اما ممکن است چیزهای حرکت در اطراف در دسترس نباشد. اما در کوتاه مدت، که گران است، درست است؟ از آنجا که اگر شما یک تکه از حافظه این اندازه، اما شما واقعا می خواهید یک از این اندازه، و شما می خواهید برای حفظ عناصر اصلی، شما باید تقریبا یک زمان فرایند کپی کردن خطی که باید از اتفاق می افتد آرایه قدیمی به جدید. و واقعیت این است پرسیدن عامل سیستم دوباره و دوباره و دوباره تکه های بزرگی از حافظه می توانید شروع به به شما هزینه برخی از زمان نیز هست. پس از آن هم یک برکت و رحمت و لعنت در پنهان، این واقعیت است که این آرایه ها اندازه ثابت هستند. اما در عوض چیزی است که اگر معرفی می کنیم شبیه به این، که ما به نام وابسته به لیست، ما شاهد رشد آمارهای چند و چند جنبه های منفی نیز هست. بنابراین یک لیست پیوندی است که به سادگی داده ها ساختار از struct ها در C در این ساخته شده است مورد، که در آن ساختار، به یاد می آورند، فقط یک ظرف برای یک یا چند خاص انواع متغیرها. در این مورد، چه نوع داده به نظر می رسد داخل این ساختار که در زمان گذشته ما به نام گره؟ هر یک از این مستطیل یک گره است. و هر یک از مستطیل کوچکتر در داخل آن یک نوع داده است. چه نوع ما می گویند آنها در روز دوشنبه بود؟ آره؟ دانشجو: [نامفهوم]. SPEAKER 1: یک متغیر و یک اشاره گر، یا به طور خاص، بین المللی، برای n و یک اشاره گر در پایین. هر دو از این اتفاق می افتد به 32 بیت، در دست کم در یک کامپیوتر مثل این CS50 لوازم خانگی، و به طوری که آنها هستید به همان اندازه در اندازه کشیده شده است. پس چه با استفاده از اشاره گر هر چند ظاهرا؟ چرا اضافه کردن این فلش در حال حاضر وقتی که آرایه ها بسیار زیبا و تمیز و ساده است؟ آنچه که اشاره گر انجام ما را در هر یک از این گره ها؟ دانشجو: [نامفهوم]. SPEAKER 1: دقیقا. آن را به شما گفتن که در آن یک بعدی است. بنابراین من مرتب کردن بر اساس استفاده از قیاس با استفاده از یک موضوع مرتب سازی بر اساس موضوع این گره با هم. و این دقیقا همان چیزی است که ما در حال انجام با اشاره گر به دلیل هر یک از این تکه های حافظه ممکن است یا نه ممکن است به هم پیوسته، پشت به پشت به پشت داخل RAM، چرا که هر زمانی که شما تماس با malloc گفت، من به اندازه کافی کلمه در ادامه متن برای یک گره جدید، ممکن است اینجا می شود و یا آن را ممکن است در اینجا. این ممکن است به اینجا. این ممکن است به اینجا. شما فقط نمی دانم. اما با استفاده از اشاره گرها در آدرس این گره ها، شما می توانید کوک آنها را با هم در راه است که به نظر می رسد بصری مانند یک لیست حتی اگر این چیزها همه از در سراسر یک یا خود را گسترش دو یا چهار گیگابایت رم در داخل کامپیوتر خود تغییر دهید. بنابراین در حرکت نزولی، پس از آن، یک لیست پیوندی چیست؟ قیمت ما چه خبر ظاهرا پرداخت؟ دانشجو: [نامفهوم]. SPEAKER 1: فضای بیشتر، درست است؟ ایم، در این مورد، دو برابر مقدار فضا از آنجا که ما رفته از 32 بیت برای هر گره، برای هر INT، بنابراین در حال حاضر 64 بیت چون ما به نگه دارید در اطراف یک اشاره گر نیز هست. شما دریافت می کنید بهره وری بیشتر اگر ساختار خود را بزرگتر از این چیزی که ساده است. در واقع اگر شما یک دانش آموز در داخل که یک زن و شوهر از رشته ها است نام و خانه، شاید شماره ID، شاید برخی از زمینه های دیگر در دسترس نباشد. بنابراین اگر شما ساختار بزرگ به اندازه کافی، پس از آن شاید هزینه از اشاره گر است نه چنین معامله بزرگ است. این است که کمی در مورد گوشه ای است که در ما در حال ذخیره سازی چنین بدوی ساده در داخل لیست پیوندی. اما نکته همان است. شما قطعا هزینه های بیشتر حافظه است، اما شما در حال گرفتن انعطاف پذیری. از آنجا که در حال حاضر اگر من می خواهم برای اضافه کردن یک عنصر در ابتدای این لیست، من به اختصاص یک گره جدید. و من باید فقط کسانی که به روز رسانی فلش به نحوی فقط در حال حرکت برخی از اشاره گرها در اطراف. اگر من می خواهم برای قرار دادن چیزی به وسط لیست، من لازم نیست فشار هر کس کنار مثل ما در هفته گذشته با داوطلبان ما که نشان داده یک آرایه. من فقط می توانید اختصاص یک گره جدید پس از آن درست نقطه مقابل فلش در جهات مختلف به دلیل آن را نمی کند به در واقعی باقی می ماند حافظه یک خط درست مثل من کشیده ام آن را در اینجا بر روی صفحه نمایش. و سپس در نهایت، اگر شما می خواهید وارد کنید چیزی در انتهای لیست، آن را حتی ساده تر. این مرتب کردن بر اساس نماد دلخواه است، اما اشاره گر 34 را یک حدس است. ارزش اشاره گر آن چیست مرتب کردن بر اساس احتمال کشیده مثل قدیمی آنتن مدرسه وجود دارد؟ دانشجو: [نامفهوم]. SPEAKER 1: احتمالا صفر است. و در واقع این است که یک نویسنده نمایندگی از تهی. و آن را به صفر است زیرا شما کاملا باید بدانید که پایان مرتبط لیست است، تا مبادا شما را زیر و به دنبال و پس از این فلش به برخی از ارزش زباله. بنابراین تهی دلالت خواهد کرد که وجود ندارد گره های بیشتری را به سمت راست شماره 34، در این مورد. بنابراین ما پیشنهاد می کنند که ما می توانیم پیاده سازی این گره در کد. و ما این نوع را دیده ام نحو قبل از. Typedef فقط تعریف یک نوع جدید برای ما، به ما می دهد مترادف مثل رشته کاراکتر * بود. در این مورد، آن را به ما بدهد نماد مختصر به طوری که گره ساختار می توانید به جای فقط به عنوان نوشته شده است گره، که یک پاک کننده زیادی. این بسیار کمتر دراز است. در داخل از یک گره است ظاهرا بین المللی N نامیده می شود، و سپس یک گره در ساختار * که به معنی دقیقا همان چیزی است که ما می خواستیم فلش به معنی، یک اشاره گر به دیگری گره از نوع داده های یکسان. و پیشنهاد می کنم که ما می توانیم پیاده سازی تابع جستجو مانند این، که در نگاه اول ممکن است به نظر می رسد کمی پیچیده است. اما اجازه دهید آن را در متن ببینید. به من اجازه رفتن را به دستگاه اینجا. اجازه دهید من باز کردن یک فایل به نام نقطه صفر ساعت. و تنها شامل تعریف ما فقط یک لحظه پیش برای این داده ها را دیدم نوع گره نامیده می شود. بنابراین ما این است که به یک فایل نقطه ساعت قرار داده است. و به عنوان یک به کنار، حتی اگر این برنامه ای است که شما خواهید دید نه همه که پیچیده است، آن در واقع کنوانسیون در هنگام نوشتن یک برنامه به قرار دادن چیزهایی مثل انواع داده ها، به جلو ثابت گاهی اوقات، در داخل خود را فایل هدر و نه لزوما در فایل C خود، قطعا هنگامی که خود را برنامه های بزرگ تر و بزرگ تر است، به طوری که شما می دانید که در آن به نگاه هر دو برای مستندات در برخی موارد، یا اصول اولیه مانند این، تعریف برخی از نوع. اگر من در حال حاضر باز کردن لیست صفر نقطه ج، متوجه چند چیز. این شامل چند فایل هدر، که ما قبلا دیده ام. این شامل فایل هدر خود را. و به عنوان یک کنار، چرا که دو برابر به نقل از اینجا، به عنوان مخالف به زاویه براکت روی خط که من آنجا هایلایت شده اید؟ دانشجو: [نامفهوم]. SPEAKER 1: بله پس از آن یک فایل محلی است. بنابراین اگر آن را در یک فایل محلی خود را در اینجا در خط 15 به عنوان مثال، شما با استفاده از نقل قول دوتایی به جای براکت زاویه دار. در حال حاضر این نوع جالب است. توجه کنید که من اعلام کرده ام جهانی متغیر در این برنامه در خط 18 نامیده می شود برای اولین بار، این ایده این است رفتن به یک اشاره گر به اول گره در لیست پیوندی من، و من مقداردهی اولیه آن را به تهی، چون من اختصاص داده شده هیچ واقعی گره فقط رتبهدهی نشده است. پس این نشان دهنده، pictorially، آنچه که ما یک لحظه پیش در تصویر به عنوان شاهد که اشاره گر در دور سمت چپ دست. بنابراین در حال حاضر، که اشاره گر فلش ندارد. آن را به جای فقط تهی است. اما آن را نشان دهنده چه خواهد بود آدرس اولین واقعی گره در این لیست. بنابراین من اجرا کرده ام آن است که یک جهانی چون، همانطور که شما خواهید دید، این همه برنامه در زندگی پیاده سازی لیست پیوندی برای من. حالا من چند نمونه در اینجا. من تصمیم به پیاده سازی ویژگی های مانند حذف، درج، جستجو، و پیمایش - آخرین پیاده روی در سراسر لیست، چاپ کردن عناصر آن. و در حال حاضر در اینجا معمول اصلی من است. و ما زمان زیادی را صرف این از آنجایی که این مرتب کردن بر اساس، امیدوارم کلاه های قدیمی در حال حاضر. من قصد دارم به انجام موارد زیر، در حالی که کاربر همکاری می کند. بنابراین یکی، من قصد دارم برای چاپ از این منو. و من آن را به عنوان فرمت ام پاک به عنوان من می توانم. در صورتی که کاربر در انواع در یکی، این بدان معناست که آنها می خواهند چیزی را حذف کنید. در صورتی که کاربر در انواع در دو، این بدان معناست که آنها می خواهند به قرار دادن چیزی. و غیره. من قصد دارم پس از آن بی درنگ پس از آن برای یک دستور. و سپس من قصد دارم به استفاده از GetInt. پس این است که یک واقعا menuing ساده رابط که در آن شما فقط باید به نوع نقشه شماره یک از این دستورات است. و در حال حاضر من یک سوئیچ خوب تمیز بیانیه ای که به سوئیچ هر کاربر تایپ شوید. و اگر آنها به تایپ به یکی، من تماس حذف و شکستن. اگر آنها تایپ دو، من تماس برای درج و برای شکستن. و در حال حاضر متوجه من هر قرار داده ام این در همان خط. این فقط یک تصمیم سبکی است. به طور معمول ما چیزی است که دیده ام مثل این. اما من فقط تصمیم گرفت، رک و پوست کنده، برنامه های من نگاه بیشتر قابل خواندن است به دلیل تنها چهار مورد بود فقط آن را شبیه به این لیست است. کاملا مشروع استفاده از سبک. و من قصد دارم برای انجام این کار تا زمانی که کاربر صفر تایپ نیست، که من تصمیم این معنی خواهد بود که آنها می خواهند به ترک. بنابراین در حال حاضر متوجه آنچه که من هستم رفتن برای انجام در اینجا. من قصد دارم برای آزاد کردن لیست ظاهرا. اما بیشتر در مورد که در یک لحظه. بیایید برای اولین بار اجرای این برنامه. پس اجازه دهید من یک ترمینال بزرگتر پنجره، نقطه بریده بریده لیست 0. من قصد دارم به جلو بروید و وارد تایپ دو، مانند 50، و در حال حاضر شما خواهید دید این لیست در حال حاضر 50. و من فقط بر میگردین بالا کمی. بنابراین در حال حاضر متوجه این فهرست شامل شماره 50. اجازه دهید قرار دادن دیگری با در نظر گرفتن دو. نوع در تعدادی مانند یک. لیست در حال حاضر، و پس از 50. بنابراین این فقط یک نمایندگی متنی از لیست. و اجازه دهید وارد کردن شماره یک بیشتر شبیه شماره 42، است که امیدوارم رفتن به تا پایان در وسط، به دلیل این برنامه در نوع خاص آن عناصر آن را به عنوان آنها را درج. بنابراین ما آن را داشته باشد. برنامه فوق العاده ساده است که می تواند کاملا یک آرایه استفاده کرده اند، اما من اتفاق می افتد به توان با استفاده از لیست پیوندی بنابراین من می تواند به صورت پویا رشد و کوچک شدن آن. پس را برای جستجو یک نگاه کنیم، اگر من دستور سوم را اجرا کنید، من می خواهم برای جستجو ، می گویند، شماره 43. و هیچ چیز ظاهرا پیدا شد، چون من پشت کردم هیچ پاسخ. بنابراین اجازه دهید این کار را دوباره انجام. جستجو کنید. جستجو اجازه دهید برای 50، یا به جای جستجو 42، که تا به خوبی معنای ظریف کمی. و من معنای زندگی وجود دارد در بر داشت. شماره 42، اگر شما نمی دانید مرجع، آن را گوگل. بسیار خوب. بنابراین آنچه که این برنامه را برای من انجام می شود؟ این فقط به من اجازه درج در نتیجه دور و جستجو برای عناصر. بیایید سریع به جلو، و سپس، به که عملکرد ما در نگاه در روز دوشنبه به عنوان یک تیزر. بنابراین این تابع، من ادعا می کنند، جستجو برای یک عنصر در لیست را با اولین ، باعث کاربر و پس از آن خواستار GetInt برای به دست آوردن یک int واقعی که شما می خواهید برای جستجو. سپس این اطلاع می دهد. من قصد دارم برای ایجاد یک متغیر موقت در خط 188 به نام اشاره گر - PTR - می تواند آن را به هر چیزی. و آن را یک اشاره گر به گره چون من گفتم گره * وجود دارد. و من مقدار دهی اولیه آن را به صورت برابر برای اولین بار است که من به طور موثر انگشت، پس به صحبت می کنند، در تاریخ بسیار اولین عنصر از لیست. بنابراین اگر دست راست من در اینجا این است PTR من اشاره به همان چیزی است که برای اولین بار است اشاره. بنابراین در حال حاضر در کد، چه اتفاقی می افتد بعدی - این یک الگوی مشترک زمانی است که تکرار بیش از یک ساختار مانند یک لیست پیوندی. من قصد دارم به انجام موارد زیر در حالی که اشاره گر برابر است به تهی بنابراین نیست در حالی که انگشت من است اشاره در برخی از تهی ارزش، اگر اشاره گر فلش N برابر N است. ما اول متوجه خواهید شد که n است کاربر تایپ در هر GetInts ها تماس بگیرید در اینجا. و اشاره گر فلش N یعنی چه؟ خوب اگر ما به عقب برویم به تصویر در اینجا، اگر من یک انگشت اشاره در که اولین گره حاوی نه، فلش اساسا به معنی رفتن به آن گره و گرفتن مقدار در محل سکونت، در این مورد، زمینه داده نامیده می شود. همانطور که به کنار - و ما شاهد این یک زن و شوهر هفته پیش زمانی که کسی که خواسته - این نحو جدید است، اما آن را نمی کند قدرت به ما بدهد که ما در حال حاضر نیست داشته باشد. این عبارت معادل با استفاده از چه بود دات نت نویسی و ستاره یک زن و شوهر هفته پیش هنگامی که ما پوست کنده این لایه کمی قبل از موعد مقرر؟ دانشجو: [نامفهوم]. SPEAKER 1: دقیقا، این ستاره بود، و سپس آن را ستاره دات نفر بود، با پرانتز در اینجا، که به نظر می رسد، رک و پوست کنده، من فکر می کنم بسیاری بیشتر مرموز به خواندن. اما ستاره اشاره گر، مثل همیشه، معنی وجود دارد. و هنگامی که شما وجود دارد، چه داده زمینه می خواهید برای دسترسی به؟ خوب شما استفاده از نماد نقطه برای دسترسی به یک فیلد داده از struct ها، و من به طور خاص می خواهید N. صادقانه بگویم، من این استدلال فقط سخت تر به خواندن. آن را سخت تر به یاد داشته باشید که در آن آیا پرانتز، ستاره و همه از آن. بنابراین جهان به تصویب رسید برخی نحوی شکر، پس به صحبت می کنند. فقط یک راه های سکسی از گفتن، این معادل است، و شاید بیشتر بصری. اگر اشاره گر است که در واقع یک اشاره گر، فلش استفاده از نماد به وجود دارد و پیدا کردن زمینه در این مورد به نام. بنابراین اگر آن را پیدا کنم، متوجه آنچه که من انجام می دهند. من به سادگی نسخه قابل چاپ کردن، متوجه شدم درصد من، متصل کردن در ارزش که int. من اسمش خواب برای یک ثانیه فقط به نوع از چیزهایی مکث بر روی صفحه نمایش کاربر دوم به جذب فقط چه اتفاقی افتاده. و سپس من را بشکند. در غیر این صورت، چه می توانم بکنم؟ اشاره گر به روز رسانی من برابر اشاره گر arrow بعدی. بنابراین فقط به روشن است، این به این معنی بروید ، با استفاده از نماد قدیمی مدرسه من وجود دارد. بنابراین این حالت فقط بدان معناست برای رفتن به هر شما در حال اشاره در، که در بسیار مورد اول این است که من با اشاره به ساختار نه در آن. بنابراین من آنجا رفته ام. و پس از آن نماد نقطه به معنای، دریافت ارزش در بعدی. اما ارزش، حتی اگر آن را کشیده به عنوان باریک، فقط یک عدد است. این یک آدرس عددی است. بنابراین این یک خط کد، اعم از نوشته شده شبیه به این، مرموز تر راه، و یا شبیه به این، کمی بیشتر راه بصری، فقط به معنای حرکت دست من از اولین گره به یک بعدی، و سپس یکی بعد، و پس از آن یکی از آینده، و غیره. بنابراین ما نمی خواهد از سوی دیگر ساکن پیاده سازی شده از درج و حذف و پیمایش، دو مورد اول از که نسبتا درگیر شده است. و من فکر می کنم آن را بسیار آسان برای به دست آوردن از دست رفته در هنگام انجام آن را بطور شفاهی. اما آنچه ما در اینجا می توانید انجام دهید این است سعی برای تعیین چگونگی بهترین به انجام این کار بصری. از آنجا که من می خواهم پیشنهاد می کنند که اگر ما می خواهم به قرار دادن عناصر به این لیست موجود، که دارای پنج عنصر - 9، 17، 22، 26، و 33 - اگر من قرار بود به پیاده سازی این کد، من نیاز به در نظر گرفتن چگونه به در مورد انجام این کار است. و من می خواهم پیشنهاد در نظر گرفتن گام های کودک به موجب آن، در این مورد منظورم این است که چه هستند حالات ممکن است که ما ممکن است به طور کلی روبرو می شوند؟ هنگام اجرای قرار دادن برای مرتبط لیست است، این فقط اتفاق می افتد به عنوان یک مثال خاص از اندازه پنج. خوب اگر شما می خواهید برای وارد کردن یک عدد، می گویند که شماره یک، و حفظ نظم مرتب شده باشد، که در آن به وضوح می کند شماره یک نیاز به. در این مثال خاص؟ در ابتدا می خواهم. اما آنچه جالب است این است که وجود دارد اگر شما می خواهید به قرار دادن یکی به این لیست، آنچه اشاره گر خاص نیاز دارد به ظاهرا به روز شده؟ برای اولین بار. بنابراین می خواهم بگویم، این اولین مورد است که ما ممکن است بخواهید در نظر گرفتن، سناریو شامل قرار دادن در آغاز از لیست. بیایید شهامت شاید به عنوان آسان و یا حتی مورد ساده تر، نسبتا صحبت کردن. فرض کنید من می خواهم برای وارد کردن شماره 35 به منظور طبقه بندی شده اند. آن را به وضوح بیش از وجود دارد تعلق دارد. بنابراین چه چیزی اشاره گر بدیهی است که رفتن به در این سناریو به روز شده؟ اشاره گر 34 تبدیل شدن به تهی نیست اما آدرس از ساختارها (struct) حاوی تعداد 35. به طوری که دو مورد است. بنابراین در حال حاضر، من نوعی از کوانتیزه هستم چقدر کار من باید انجام دهید در اینجا. و در نهایت، در مورد متوسط ​​آشکار است در واقع، در وسط، اگر من می خواهم به قرار دادن چیزی مانند 23، است که می رود بین 23 و 26 است، اما در حال حاضر همه چیز کمی بیشتر درگیر زیرا آنچه اشاره گر نیاز به تغییر دارند؟ بنابراین 22 بدیهی است که نیاز به تغییر چرا که او نه می تواند تا 26 نقطه دیگر. او نیاز به اشاره به گره جدید است که من باید با تماس با اختصاص malloc و یا برخی از معادل آن. اما پس از آن من هم نیاز است که گره جدید، 23 در این مورد، به اشاره گر خود را اشاره در آنها؟ 26. و رفتن به یک وجود دارد منظور از عملیات در اینجا. از آنجا اگر من این کار احمقانه، و من برای شروع عنوان مثال در ابتدای لیست، و هدف من این است به قرار دادن 23. و من چک می کنم، آن را متعلق در اینجا، در نزدیکی نه؟ شماره آیا این به اینجا تعلق، در کنار 17؟ شماره آیا آن تعلق دارد در اینجا در کنار به 22؟ بله. در حال حاضر اگر من در اینجا احمق هستم، و نه فکر این را از طریق، من ممکن است تخصیص گره جدید من برای 23. من ممکن است اشاره گر از به روز رسانی گره به نام 22، با اشاره آن را در گره جدید است. و سپس آنچه را می توانم برای به روز رسانی اشاره گر به گره های جدید می شود؟ دانشجو: [نامفهوم]. SPEAKER 1: دقیقا. اشاره در 26. اما dammit اگر من در حال حاضر به روز رسانی اشاره گر 22 را به نقطه در این مرد، و در حال حاضر من یتیم، بقیه لیست، پس به صحبت می کنند. بنابراین منظور از عملیات در اینجا رفتن مهم است. برای انجام این کار می تواند از من سرقت، گویند، شش داوطلبان. و بیایید ببینید که اگر ما نمی توانیم این کار را انجام بصری به جای کد عاقلانه. و ما باید برخی از استرس های دوست داشتنی توپ را برای شما امروز. خوب، چگونه در مورد یک، دو، در پشت - در پایان وجود دارد. سه، چهار، هر دو از شما بچه ها در پایان. و پنج، شش. مطمئن شوید. پنج و شش. تمامی حق و خواهیم آمد به شما بچه ها دفعه بعد. همه حق است، در بالا آمده است. همه حق است، از آنجایی که شما در اینجا هستید، می خواهم شما را به سختی در گوگل شیشه ای اینجا؟ همه حق است، بنابراین، خوب، شیشه ای، ضبط یک ویدیو. خوب، شما خوب به آن بروید. همه حق است، بنابراین اگر شما بچه ها می توانند بیش از در اینجا، من از پیش آماده برخی از اعداد. همه حق است، آمده بر روی بیش از اینجا. و چرا شما نه کمی بیشتر که راه. و اجازه دهید را ببینید، نام شما چیست، با شیشه گوگل؟ دانشجو: بن. SPEAKER 1: بن؟ OK، بن، شما خواهد بود برای اولین بار، به معنای واقعی کلمه. بنابراین ما قصد داریم برای شما ارسال به پایان مرحله است. همه حق است، و نام خود را؟ دانشجو: جیسون. SPEAKER 1: جیسون، OK نظر شما تعداد نه. بنابراین اگر شما می خواهید به دنبال بن که راه. دانشجو: جیل. SPEAKER 1: جیل، شما در حال رفتن به 17، که اگر من می خواهم این موضوع را بیشتر انجام می شود هوشمندانه، من می خواهم که آغاز شده در انتهای دیگر. شما بروید که راه. 22. و شما؟ دانشجو: مریم. SPEAKER 1: مری، شما باید 22. و نام خود را است؟ دانشجو: کریس. SPEAKER 1: کریس، شما خواهید بود 26. و سپس در آخر. دانشجو: دیانا. SPEAKER 1: دیانا، شما باید 34. بنابراین شما بر روی بیش به اینجا می آیند. همه حق است، پس کامل طبقه بندی شده اند سفارش در حال حاضر. و اجازه دهید به جلو و این کار را انجام به طوری که ما واقعا می تواند - بن شما فقط نوع نگاه به هیچ جا وجود دارد. خوب، پس اجازه دهید به جلو و به تصویر کشیدن این با استفاده از اسلحه، بسیار شبیه به من بود، دقیقا، چه خبر است. پس پیش بروید و خودتان را پای پیاده و یا دو نفر بین خودتان. و جلو بروید و اشاره با یک دست به هر کس که شما باید در اشاره بر اساس این. و اگر شما صفر هستید فقط اشاره راست پایین به طبقه. خوب، خیلی خوب است. بنابراین در حال حاضر ما باید یک لیست پیوندی، و اجازه دهید من پیشنهاد می کنند که من نقش بازی PTR، بنابراین من نمی خواهد زحمت حمل این اطراف. و پس از آن - کنوانسیون کسی احمقانه - شما می توانید هر چیزی که شما می خواهید تماس بگیرید - سلف اشاره گر، اشاره گر pred - آن را فقط نام مستعار ما در به کد نمونه ما به دست چپ من. از سوی دیگر که رفتن به نگه داشتن ردیابی است که که در سناریوهای زیر. بنابراین فرض، برای اولین بار، من می خواهم به دل و جرات کردن که اولین نمونه قرار دادن، می گویند 20، به لیست. بنابراین من قصد دارم به کسی نیاز به تجسم عدد 20 برای ما. بنابراین من نیاز به کسی malloc از مخاطب. بیا بالا. نام شما چیست؟ دانشجو: برایان. SPEAKER 1: برایان، همه حق است، بنابراین شما باید گره حاوی 20 باشد. همه حق است، آمده بر روی بیش از اینجا. و بدیهی است، که در آن برایان تعلق دارد؟ بنابراین، در وسط - در واقع، یک دقیقه صبر کنید. ما در حال انجام این کار خارج از دستور. ما در حال ساخت این خیلی سخت تر از آن باید در ابتدا باشد. خوب، ما قصد داریم به رایگان برایان و بازتخصیص برایان پنج. خوب، بنابراین در حال حاضر ما می خواهیم برای وارد کردن برایان به عنوان پنج. بنابراین بر روی بیش به اینجا می آیند در کنار بن برای فقط یک لحظه. و شما احتمالا می تواند بگوید که این ماجرا می گذرد. اما بیایید با دقت در مورد فکر می کنم منظور از عملیات. و آن را دقیقا همین بصری که رفتن به خط تا با آن نمونه کد. بنابراین در اینجا من PTR اشاره در ابتدا در بن، فی نفسه نیست، اما در هر ارزش او وجود دارد، که در این مورد - نام خود را دوباره؟ دانشجو: جیسون. SPEAKER 1: جیسون، به طوری که هر دو بن و من با اشاره به جیسون در این لحظه. بنابراین در حال حاضر من مجبور به تعیین، برایان کجا تعلق دارند؟ بنابراین تنها چیزی که من به اینترنت دسترسی دارند در حال حاضر او نفر قلم داده است. بنابراین من قصد دارم برای چک کردن، برایان کمتر از جیسون؟ پاسخ درست است. بنابراین آنچه در حال حاضر نیاز به اتفاق می افتد، در جهت درست است؟ من نیاز به به روز رسانی چگونه بسیاری از اشاره گرها در مجموع در این داستان؟ از کجا دست من است هنوز هم در اشاره جیسون، و دست خود را - اگر شما می خواهید قرار دادن دست خود را مانند، مرتب کردن، من نمی دانم، یک علامت سوال. خوب، خوب است. همه حق است، بنابراین شما باید چند نامزد. یا بن یا من یا برایان و یا جیسون یا هر کس دیگری، که اشاره گر نیاز به تغییر؟ چگونه بسیاری در مجموع؟ OK SO دو. اشاره گر من واقعا مهم نیست دیگر چون من فقط به طور موقت هستم. پس از آن این دو نفر، احتمالا، هر دو بن و برایان. بنابراین اجازه دهید به من پیشنهاد می کنند که ما به روز رسانی بن، از او برای اولین بار می باشد. این عنصر برای اولین بار از این لیست در حال حاضر رفتن به برایان. بنابراین نقطه بن در برایان. خوب، در حال حاضر چه؟ چه کسی می شود که در آنها اشاره کرد؟ دانشجو: [نامفهوم]. SPEAKER 1: OK بنابراین برایان به در اشاره جیسون. اما من از دست داده مسیر که اشاره گر؟ آیا من می دانم که در آن جیسون است؟ دانشجو: [نامفهوم]. SPEAKER 1: من، از آنجایی که من هستم اشاره گر به طور موقت. و احتمالا، من تغییر نکرده است در گره جدید اشاره. بنابراین ما به سادگی می توانید نقطه برایان در هر کس به من اشاره در. و ما در حال انجام می شود. بنابراین مورد، درج در آغاز از لیست. دو مرحله اصلی وجود دارد. یکی از ما باید برای به روز رسانی از بن، و سپس ما نیز باید برای به روز رسانی برایان. و سپس من لازم نیست به زحمت ، جستجو از طریق بقیه لیست، چرا که ما در حال حاضر او محل، چون او به تعلق سمت چپ عنصر اول است. همه حق است، بنابراین خیلی سر راست است. در واقع، احساس می کند مانند ما تقریبا هستید و این بیش از حد پیچیده است. پس اجازه دهید در حال حاضر شهامت پایان لیست، و ببینید که در آن پیچیدگی آغاز می شود. بنابراین اگر در حال حاضر، من alloc از مخاطبان. هر کس می خواهید به بازی 55؟ همه حق است، من دست خود را برای اولین بار دیدم. بیا بالا. آره. نام شما چیست؟ دانشجو: [نامفهوم]. SPEAKER 1: Habata. خوب، بیا. شما عدد 55 باشد. بنابراین شما، البته، متعلق در انتهای لیست. بنابراین پخش شبیه سازی با من PTR برای فقط یک لحظه. بنابراین من برای اولین بار رفتن به نقطه در هر بن در اشاره. ما هر دو طرف در حال حاضر در برایان. بنابراین 55 است نه کمتر از پنج. بنابراین من قصد دارم به خودم به روز رسانی با اشاره به اشاره گر بعدی برایان، که اکنون البته جیسون. 55 کمتر از نه نیست، بنابراین من قصد دارم برای به روز رسانی PTR. من قصد دارم برای به روز رسانی PTR. من قصد دارم برای به روز رسانی PTR من قصد دارم برای به روز رسانی PTR. و من قصد دارم به - HMM، آنچه نام خود را دوباره؟ دانشجو: دیانا. SPEAKER 1: دیانا اشاره است، البته، در تهی با دست چپ خود. پس کجا Habata در واقع به وضوح تعلق دارد؟ به سمت چپ، در اینجا. پس چگونه می توانم من می دانم که او را در اینجا من فکر می کنم من پیچ ام. چون چیزی که PTR هنر این لحظه در زمان؟ تهی. بنابراین حتی اگر، بصری، ما می توانیم بدیهی است که تمام این را ببینید بچه ها در اینجا روی صحنه. من مسیر قبلی نگه داشته است فرد در لیست. من انگشت اشاره را نداشته باشند، در این مورد، گره شماره 34. پس در واقع بیش از این شروع کنیم. بنابراین در حال حاضر من در واقع نیازی یک متغیر محلی است. و این همان چیزی است که شما در دیدن کد C نمونه واقعی، جایی که به عنوان من می روم، هنگامی که دست راست خود را به روز رسانی کنم به نقطه جیسون، در نتیجه ترک برایان پشت سر، من بهتر است شروع به استفاده از دست چپ من را به به روز رسانی که در آن من بود، به طوری که به عنوان من به از طریق این لیست - به سختی از من در نظر گرفته شده در حال حاضر اینجا بصری - من قصد دارم برای رسیدن به انتهای لیست. این دست است که هنوز هم صفر است، که بسیار بی فایده، دیگر نسبت به نشان می دهد من به وضوح هستم در انتهای لیست، اما در حال حاضر حداقل من این اشاره گر سلف اشاره در اینجا، بنابراین در حال حاضر چه دست و اشاره گر نیاز دارند به روز شود؟ چه کسانی به دست شما می خواهید به پیکربندی مجدد برای اولین بار؟ دانشجو: [نامفهوم]. SPEAKER 1: OK، بنابراین دیانا. که در آن شما می خواهید به نقطه اشاره گر چپ دیانا در؟ در 55، احتمالا، به طوری که ما در آنجا قرار داده ام. و 55 اشاره گر که در آن باید برود؟ پایین، به نمایندگی از تهی. و تو دست من، در این نقطه، نمی کنند مهم زیرا آنها فقط متغیرهای موقت. بنابراین در حال حاضر ما در حال انجام می شود. بنابراین پیچیدگی اضافی وجود دارد - و آن است که سخت به پیاده سازی نیست، اما ما نیاز به یک متغیر ثانویه به شوید که قبل از من راست من حرکت دست، من مقدار سمت چپ من به روز رسانی دست، اشاره گر pred در این مورد، پس از که من آن را یک اشاره گر دنباله برای پیگیری از جایی که من بود. در حال حاضر به عنوان یک کنار، اگر شما به فکر این از طریق، این احساس مانند آن را کمی آزار دهنده است که به حفظ پیگیری این دست چپ. چه می خواهند یکی دیگر از راه حل برای این مشکل شده اند؟ اگر شما به طراحی مجدد داده ها ساختار ما در حال صحبت کردن از طریق در حال حاضر؟ اگر این نوع فقط یک کمی احساس آزار دهنده به، مانند، دو اشاره گر رفتن را از طریق لیست، چه کس دیگری می تواند اند، در یک دنیای ایده آل، داشت اطلاعات است که ما نیاز داریم؟ آره؟ دانشجو: [نامفهوم]. SPEAKER 1: دقیقا. بنابراین در واقع وجود دارد جالب نطفه یک ایده. و این ایده از یک اشاره گر قبلی، اشاره به عنصر قبلی. چه می شود اگر من فقط گنجانده شده است که داخل خود لیست و آن را به سختی به تجسم این کار را بدون کاغذ در حال سقوط به زمین است. اما فرض کنید که این بچه ها استفاده از هر دو دست خود را به یک قبلی اشاره گر، و یک اشاره گر بعد، در نتیجه اجرای آنچه ما می خواهیم تماس بگیرید مضاعف لیست پیوندی. که اجازه می دهد من به عقب مرتب سازی بر اساس: بسیار راحت تر بدون من، برنامه نویس، نیاز به نگه داشتن ردیابی دستی - واقعا دستی - از جایی که من قبلا در لیست. بنابراین ما نمی خواهد انجام دهد. ما آن را ساده نگه دارید چرا که رفتن در قیمت آمده است، دو بار به عنوان فضای زیادی برای اشاره گر، اگر شما می خواهید. اما این در واقع مشترک ساختار داده ها شناخته شده است به عنوان یک مضاعف لیست پیوندی. اجازه دهید مثال نهایی در اینجا قرار داده و این بچه ها از بدبختی خود. بنابراین malloc 20. بیا تا از راهرو وجود دارد. همه حق است، نام شما چیست؟ دانشجو: [نامفهوم]. SPEAKER 1: با عرض پوزش؟ دانشجو: [نامفهوم]. SPEAKER 1: Demeron؟ خوب در بالا آمده است. شما باید 20. شما به وضوح می رویم به بین 17 و 22 تعلق دارند. بنابراین اجازه دهید به من درس من یاد بگیرند. من قصد دارم برای شروع اشاره گر با اشاره به برایان. و من قصد دارم به دست چپ من فقط به برایان به روز رسانی که من به حرکت جیسون، بررسی می کند 20 کمتر از نه؟ شماره 20 کمتر از 17 است؟ شماره 20 کمتر از 22 است؟ بله. بنابراین چه چیزی اشاره گر ها و یا دست های نیاز به تغییر جایی که آنها در حال اشاره در حال حاضر؟ بنابراین ما می توانیم 17 اشاره در 20. به طوری که خوب است. کجا ما می خواهیم به نقطه اشاره گر شما در حال حاضر؟ در 22. و ما می دانیم که در آن 22 است، دوباره به لطف به اشاره گر موقتی من. بنابراین ما OK وجود دارد. بنابراین به دلیل این ذخیره سازی موقت من مسیر که در آن هر کس را نگه داشته ام. و در حال حاضر شما بصری می تواند به جایی که به شما تعلق دارند، و در حال حاضر ما نیاز به 1، 2، 3، 4، 5، 6، 7، 8، 9 توپ استرس، و دور از کف زدن برای این بچه ها، اگر ما می تواند. سادگی انجام می شود. [تشویق حضار] SPEAKER 1: بسیار خوب. و شما می توانید قطعات را کاغذ به عنوان یادگاری. همه حق است، بنابراین، من اعتماد زیادی آسان تر است تا از طریق آن راه رفتن با انسان از آن را با کد واقعی است. اما آنچه شما در فقط یک لحظه پیدا در حال حاضر، همان است - آه، از شما سپاسگزارم. با تشکر از شما - این است که شما که همان داده ها ساختار، یک لیست پیوندی، در واقع می تواند به عنوان یک بلوک ساختمان حتی بیشتر استفاده می شود ساختار داده های پیچیده. و برای درک بیش از حد به موضوع اینجا را کلیک کنید این است که ایم کاملا معرفی مطلب پیچیدگی به پیاده سازی این الگوریتم. درج، و اگر ما را از طریق آن رفت، حذف و جستجو، کم است پیچیده تر از آن با یک آرایه بود. اما ما برخی از پویایی به دست آورید. ما ساختار داده انطباقی. اما باز هم، ما پرداخت قیمت با بعضی از پیچیدگی اضافی، هر دو در اجرای آن. و به ما داده تا با دسترسی تصادفی است. و به صداقت، برخی از خوبی وجود ندارد اسلاید تمیز من می توانم به شما بدهد که می گوید در اینجا این است که چرا یک لیست پیوندی بهتر است از یک آرایه است. و آن را ترک که در آن. از آنجا که موضوع مطرح شد در حال حاضر، حتی بیشتر از آن در هفته های آینده، که لزوما وجود ندارد پاسخ صحیح. این است که چرا ما باید محور جداگانه طراحی برای مجموعه مشکل است. از آن خواهد شد بسیار حساس زمینه آیا شما می خواهید به استفاده از این داده ها ساختار یا آن یکی، و آن را بستگی دارد چه برای شما در شرایط منابع و پیچیدگی. اما اجازه دهید به من پیشنهاد که داده های ایده آل ساختار، جام مقدس، خواهد بود چیزی که زمان ثابت است، صرف نظر از اینکه چگونه چیزهای زیادی در داخل آن، نه آن را شگفت انگیز می شود اگر ساختار داده ها بازگشت پاسخ در زمان ثابت. بله. این واژه در فرهنگ لغت بزرگ خود است. یا نه، این کلمه است. و یا هر مشکل وجود ندارد. خب بیایید ببینید که اگر ما نمی توانیم حداقل را یک گام به سمت آن. اجازه دهید یک ساختمان داده جدید پیشنهاد من که می توان برای چیزهای مختلف مورد استفاده قرار گیرد، در این مورد به نام جدول هش. و به همین ترتیب ما در واقع بازگشت به زود گذر در یک آرایه، در این مورد، و تا حدودی خودسرانه، من کشیده ام جدول هش را به عنوان یک آرایه با مرتب کردن بر اساس آرایه دو بعدی - و یا به جای آن را در اینجا به عنوان یک دو نشان داده شده است آرایه بعدی - اما این فقط آرایه ای از اندازه 26، به طوری که اگر ما تماس جدول آرایه، براکت جدول صفر مستطیل در بالای صفحه است. جدول براکت 25 مستطیل است در پایین. و این است که چگونه ممکن است اطلاعات قرعه کشی ساختاری که در آن من می خواهم برای ذخیره نام مردم. بنابراین به عنوان مثال، من به قرعه کشی نیست همه چیز در اینجا در بالای سر، اگر من تا به حال این آرایه، که من در حال حاضر رفتن به یک جدول هش تماس بگیرید، و این دوباره محل صفر. این مکان است یک، و غیره. من ادعا می کنند که من می خواهم به استفاده از این داده ها ساختار، برای خاطر از بحث و گفتگو، برای ذخیره نام مردم، Alice و Bob و چارلی و نام دیگر از این قبیل. بنابراین از این در حال حاضر به عنوان آغاز فکر می کنم ، می گویند، یک فرهنگ لغت با تعداد زیادی از کلمات. آنها اتفاق می افتد به نام در مثال ما در اینجا. و این همه بیش از حد وابسته است، شاید، به پیاده سازی کنترل کننده املا، همانطور که ما ممکن است برای مشکل مجموعه شش. بنابراین اگر ما آرایه ای از حجم کلی 26 به طوری که این محل 25 در پایین، و من ادعا می کنند که آلیس است اولین کلمه در فرهنگ لغت نام هایی که من می خواهم برای وارد کردن به رم، به این ساختار داده ها، که در آن غرایز شما گفتن که آلیس نام باید در این آرایه برود؟ ما 26 گزینه. که در آن ما می خواهیم به او قرار داده است؟ ما او را می خواهم در براکت صفر، درست است؟ برای آلیس، اجازه دهید که صفر تماس بگیرید. و B، و C خواهد بود. بنابراین ما در حال رفتن به نوشتن نام و نام خانوادگی آلیس در اینجا. اگر ما پس از آن وارد باب، او نام در اینجا خواهد رفت. چارلی در اینجا خواهد رفت. و غیره را از طریق ساختار داده ها. این ساختار داده ها فوق العاده است. چرا؟ خب چه زمان در حال اجرا است قرار دادن نام یک انسان را به این ساختار داده ها در حال حاضر؟ با توجه به این که این جدول اجرا شده است، واقعا، به عنوان یک آرایه. خب زمان ثابت آن است. این منظور از یک است. چرا؟ خوب چگونه می توانم شما تعیین که در آن آلیس متعلق است؟ شما که در آن نامه نام او نگاه می کنید؟ اول. و شما می توانید، اگر آن را به یک رشته، فقط به دنبال در رشته براکت صفر. بنابراین شخصیت صفر از رشته است. که آسان است. ما که در رمزنگاری انتساب هفته قبل در دیتا بیس ثبت شده است. و سپس یک بار شما می دانید که آلیس نامه سرمایه، ما می توانیم تفریق کردن 65 یا سرمایه خود را، که به ما صفر است. بنابراین ما در حال حاضر می دانیم که آلیس به آن تعلق دارد در محل صفر. و با توجه به یک اشاره گر به این داده ها ساختار، نوعی، چه مدت طول می کشد آن را به من را برای پیدا کردن محل صفر در یک آرایه؟ فقط یک گام، درست آن زمان ثابت است به دلیل دسترسی تصادفی ما پیشنهاد یکی از ویژگی های یک آرایه بود. بنابراین در کوتاه مدت، تا بدانند چه شاخص نام آلیس است، که در این مورد، A، و یا اجازه دهید فقط حل و فصل که به صفر، B یک و C است. دو، بدانند که از زمان ثابت است. من فقط باید به حرف اول خود را نگاه کنید، بدانند که در آن صفر است آرایه زمان ثابت است. بنابراین از لحاظ فنی که مانند دو مرحله است. اما این هنوز ثابت است. بنابراین ما تماس بگیرید که O بزرگ یکی، بنابراین ما آلیس در این جدول درج زمان ثابت. اما البته، من ساده و بی تکلف در اینجا، درست است؟ چه می شود اگر هارون در کلاس وجود دارد؟ یا آلیشیا؟ و یا هر نام دیگر و با شروع A. از کجا می خواهیم برای قرار دادن آن شخص، درست است؟ منظورم این است که، در حال حاضر تنها سه وجود دارد مردم روی میز، بنابراین شاید ما باید آرون در محل قرار داده است صفر یک دو سه. راست، من می توانم در اینجا قرار داده است. اما پس از آن، اگر ما سعی می کنیم به قرار دادن داود به این لیست، که در آن دیوید برود؟ در حال حاضر سیستم ما شروع به شکستن پایین، درست است؟ از آنجا که در حال حاضر دیوید به پایان می رسد تا اینجا اگر آرون است که در واقع در اینجا. و بنابراین در حال حاضر تمام این ایده داشتن یک ساختار داده ها پاک است که به ما می دهد اضافه زمان ثابت است و دیگر هیچ زمان ثابت، چون من به چک، آه، damnit، کسی که در حال حاضر در محل آلیس. اجازه بدهید من بقیه از این داده ها بررسی ساختار، به دنبال یک نقطه برای قرار دادن کسی مثل نام هارون. و به طوری که بیش از حد شروع را به زمان خطی است. علاوه بر این، اگر شما در حال حاضر خواهید برای پیدا کردن آرون در این ساختار داده، و شما بررسی کنید، و نام آرون است که در اینجا نیست. در حالت مطلوب، شما فقط می گویند آرون در ساختار داده ها نیست. اما اگر شما شروع به ساخت اتاق برای آرون که در آن باید وجود داشته بوده است D یا E، شما، بدترین حالت، برای بررسی کل ساختار داده ها در که در این صورت آن را به چیزی devolves خطی در اندازه میز. بنابراین همه حق است، من این را حل کنند. مشکل در اینجا است که من تا به حال 26 عنصر در این آرایه. اجازه دهید آن را تغییر بدهید. اوه. اجازه دهید آن را تغییر دهید به طوری که نه اندازه 26 در مجموع، متوجه پایین شاخص در حال رفتن به تغییر به n منهای 1. اگر 26 است که به وضوح بیش از حد کوچک برای انسان ' نام، زیرا هزاران وجود دارد نام جهان، اجازه دهید فقط مطمئن در 100 یا 1،000 10،000. بیایید فقط اختصاص فضای بسیار بیشتری. خوب است که لزوما کاهش نمی دهد احتمال این که ما نمی دو مردم با نام شروع، و بنابراین، شما قرار بود به تلاش برای قرار دادن یک نام در محل صفر هنوز. آنها هنوز هم در حال رفتن به برخورد می کنند، که معنی است که ما هنوز هم نیاز به یک راه حل برای قرار دادن آلیس و هارون و آلیشیا و دیگر نام شروع با جاهای دیگر. اما چه مقدار از یک مشکل است؟ احتمال است که شما برخورد در داده ها ساختار شبیه به این؟ خوب، به من اجازه دهید - ما می آیند به این سوال در اینجا. و در چگونه ما ممکن است نگاه کنید ابتدا آن را حل کنید. اجازه دهید من بکشد تا این پیشنهاد در اینجا. چیزی که ما فقط به شرح داده شده است، الگوریتم، اکتشافی نامیده می شود خطی کاوش به موجب آن، اگر شما سعی در درج چیزی در اینجا در این داده ها ساختار، است که به نام جدول هش، و هیچ اتاق وجود دارد، شما واقعا بررسی ساختار داده ها چک کردن، این در دسترس است؟ آیا این موجود است و این در دسترس است؟ آیا این در دسترس است؟ و هنگامی که آن را در نهایت، شما وارد نام است که شما در اصل در نظر گرفته شده در جای دیگر در آن محل. اما در بدترین حالت، تنها نقطه ممکن است پایین از داده ها ساختار پایان از آرایه. بنابراین کاوش خطی، در بدترین حالت، devolves به یک الگوریتم خطی که در آن هارون، اگر او اتفاق می افتد به درج شود آخرین در این ساختار داده، او ممکن است برخورد با این مکان برای اولین بار، اما سپس توسط بد شانس در پایان. پس این است که ثابت نیست زمان جام مقدس برای ما. این رویکرد از قرار دادن عناصر به ساختار داده ها به نام یک رشته هش جدول به نظر نمی رسد به زمان ثابت حداقل نه در حالت کلی. این می تواند به چیزی خطی واگذاردن. پس چه می شود اگر حل و فصل ما برخورد تا حدودی متفاوت است؟ بنابراین در اینجا پیچیده تر است رویکرد به آنچه هنوز به نام جدول هش. و هش، به عنوان به کنار، آنچه منظورم این است که این شاخص که من به آن اشاره پیش از آن. به چیزی هش می تواند به عنوان یک فعل تصور. بنابراین اگر شما مخلوط آلیس یک نام، یک تابع هش، پس به صحبت می کنند، باید یک عدد بازگشت. در این حالت صفر است اگر او در آن تعلق دارد محل صفر، اگر او در آن تعلق دارد محل، و غیره. بنابراین تابع هش من تا کنون بوده است فوق العاده ساده است، فقط به دنبال در حرف اول نام کسی. اما یک تابع هش طول می کشد به عنوان ورودی برخی از قطعه ای از داده ها، رشته ای، بین المللی، هر چیز دیگری. و آن را تف کردن به طور معمول یک عدد. و این تعداد است که در آن است که داده ها عنصر به آن تعلق دارد در یک ساختار داده ها در اینجا به عنوان یک جدول هش شناخته شده است. بنابراین فقط به طور مستقیم، این است که زمینه کمی متفاوت است. این در واقع اشاره به عنوان مثال مربوط به جشن های تولد، که در آن وجود دارد ممکن است به عنوان بسیاری از 31 روز در ماه. اما چه این فرد تصمیم به در صورت برخورد انجام دهید؟ بافت در حال حاضر در حال، نه یک برخورد اسم دارد، اما برخورد تولد، اگر دو نفر همان روز تولد در 2nd اکتبر، به عنوان مثال. دانشجو: [نامفهوم]. SPEAKER 1: آره، بنابراین در اینجا ما اعمال نفوذ از لیست های پیوندی. بنابراین به نظر می رسد کمی متفاوت از ما آن را قبلا به خود جلب کرد. اما ما به نظر می رسد به یک آرایه در سمت چپ. این یک شاخص است، بدون هیچ دلیل خاصی. اما هنوز هم یک آرایه. آرایه ای از اشاره گر است. و هر یک از این عناصر، هر یک از این حلقهها یا اسلش - اسلش به نمایندگی از تهی - هر یک از این اشاره گر ظاهرا به اشاره چه ساختار داده؟ لیست پیوندی. بنابراین در حال حاضر ما توانایی کد سخت به برنامه های ما اندازه جدول. در این مورد، ما می دانیم و هرگز وجود ندارد بیش از 31 روز در ماه است. خیلی سخته برنامه نویسی یک مقدار مانند 31 مناسب در این زمینه است. در زمینه نام، برنامه نویسی سخت 26 معقول نیست مردم نام تنها با شروع به عنوان مثال، الفبای مربوط از طریق زهرا ما می توانیم همه آنها را به آن داده خودرا برای امتحان اماده ساختار تا زمانی که، هنگامی که ما یک برخورد، ما با نام قرار نیست در اینجا، به جای آن ما از این سلول ها فکر می کنم نه به عنوان رشته خود، بلکه به عنوان اشاره گر به، برای مثال، آلیس. و سپس آلیس می تواند یکی دیگر از اشاره گر به نام دیگری شروع با A. و باب در واقع بیش از اینجا می رود. و اگر نام دیگری شروع وجود دارد با B، او به پایان می رسد تا بیش از اینجا. و به همین ترتیب هر یک از عناصر این جدول دو، اگر ما طراحی این کمی هوشمندانه تر - بیا - اگر ما این است که یک کمی بیشتر طراحی هوشمندانه، در حال حاضر تبدیل به داده های تطبیقی ساختار، که در آن هیچ محدودیتی سخت وجود دارد چگونه بسیاری از عناصر شما می توانید وارد کنید به آن به دلیل اگر شما مجبور برخورد، که خوب است. فقط پیش بروید و اضافه آن را چیزی است که ما یک کمی پیش دیدم شناخته شده به عنوان یک لیست پیوندی. خوب اجازه توقف برای فقط یک لحظه. احتمال برخورد چیست در وهله اول؟ راست، شاید من بیش از تفکر، شاید من بیش از مهندسی این مشکل هستم، چون شما می دانید چه؟ بله، من می توانم آمد تا با خودسرانه نمونه خاموش بالا از سر من دوست آلیسون و هارون، اما در واقعیت، با توجه به یک توزیع یکنواخت از ورودی، این است که برخی از اضافه تصادفی را به یک ساختار داده ها، آنچه واقعا است احتمال برخورد؟ خوب معلوم است، آن را در واقع بالا فوق العاده است. اجازه بدهید من با تعمیم این مشکل این است که به عنوان این است. بنابراین در یک اتاق از n CS50 دانش آموز، چه احتمال این که حداقل دو دانش آموز در اتاق همان روز تولد؟ بنابراین چیزی است که وجود دارد. hund چند - 200، 300 نفر در اینجا و چند صد نفر در خانه امروز. بنابراین اگر شما می خواهید به خودمان بپرسیم چه احتمال دو نفر در این اتاق که همان تولد، ما می توانیم این رقم را. و من ادعا می کنند در واقع دو وجود دارد مردم با همان تولد. به عنوان مثال، آیا کسی امروز روز تولد؟ دیروز؟ فردا؟ همه حق است، پس از آن احساس می کند مانند من قصد دارم باید برای انجام این کار 363 یا بیشتر زمان محلی شما به واقع کشف کردن اگر ما یک برخورد است. و یا ما فقط می تواند این کار را انجام دهند ریاضی و نه از tediously است انجام این کار است. و به شرح زیر ارائه شده است. بنابراین پیشنهاد می کنم که ما می توانیم از مدل احتمال دو نفر داشتن همان تولد به عنوان احتمال، از مجموع 1 منهای احتمال هیچ کس داشتن همان تولد. بنابراین برای دریافت این، و این فقط راه فانتزی از نوشتن این، شخص اول در اتاق، او می توانید هر یک از ممکن است داشته تولد با فرض 365 روز در سال، با پوزش به افراد مبتلا به تولد فوریه 29. بنابراین فرد برای اولین بار در این اتاق رایگان به هر تعداد از تولد از امکانات 365 به طوری که ما می خواهیم انجام شده توسط 365 که 365 تقسیم، که یکی. شخصی که در کنار در اتاق، اگر هدف برای جلوگیری از برخورد، تنها می تواند در داشته باشند و یا تولد خود را در مورد چگونگی بسیاری از روز های مختلف ممکن است؟ 364. بنابراین دوره دوم در این بیان است اساسا انجام آن ریاضی برای ما با کم کردن یک روز امکان پذیر است. و سپس روز بعد، روز بعد، روز بعد را به تعداد کل مردم در اتاق. و اگر ما پس از آن در نظر بگیرند، چه پس از آن است احتمال داشتن همه جشن های تولد منحصر به فرد، اما دوباره 1 منهای ، بیان آنچه ما دریافت می کنید که بسیار fancifully می تواند شبیه به این. اما این جالب تر در نگاه بصری. این نمودار که در آن بر روی محور x است تعداد زیادی از مردم در اتاق، تعدادی از تولد. در محور y احتمال برخورد، دو نفر داشتن همان تولد. و غذای آماده را از این منحنی است که به محض اینکه شما را وادار به دوست 40 دانش آموزان، شما را در احتمال 90٪ به combinatorically دو مردم و یا داشتن بیش همان تولد. و هنگامی که شما را وادار به دوست 58 نفر آن را نزدیک به 100٪ از این دو شانس مردم در اتاق در حال رفتن به همان روز تولد، حتی اگر وجود دارد 365 یا 366 سطل ممکن است، و تنها 58 نفر در اتاق. فقط آماری شما به احتمال زیاد برخورد، که در کوتاه مدت انگیزه این بحث است. که حتی اگر ما فانتزی در اینجا، و شروع به داشتن این زنجیره، ما هنوز رفتن به برخورد. به طوری که begs سوال، آنچه که هزینه انجام اضافه و حذف را به یک ساختار داده شبیه به این؟ خوب اجازه بدهید من پیشنهاد - و اجازه دهید برگردم به صفحه نمایش بیش از - اگر ما عناصر ازت در لیست، بنابراین اگر ما در حال تلاش برای وارد کردن n عنصر، و ما باید چگونه بسیاری از کل سطل؟ بیایید می گویند 31 مجموع سطل در مورد تولد. حداکثر طول یک چه خبر از این زنجیره بالقوه؟ اگر دوباره 31 امکان وجود دارد تولدها در یک ماه داده شده است. و ما فقط انبوه شدن همه - در واقع این یک مثال: کامپیوتر و نرم افزار است. اجازه دهید به جای انجام 26. بنابراین اگر در واقع افرادی که نام با شروع از A تا Z، در نتیجه دادن ما 26 احتمالات. و ما با استفاده از یک ساختار داده ها مانند یکی از ما فقط دیدم، به موجب آن ما آرایه ای از اشاره گر، که هر کدام امتیاز به یک لیست پیوندی که در آن اولین لیست همه است با نام آلیس. فهرست دوم این است که هر با نام شروع با یک، با شروع با B، و غیره. به احتمال زیاد از طول هر یک از چه خبر این لیست اگر فرض کنیم یک تمیز خوب توزیع از نام های A تا Z در سراسر کل ساختار داده؟ افراد n در ساختار داده ها وجود دارد تقسیم 26 و اگر آنها به خوبی هستیم گسترش بیش از کل ساختار داده ها. به طوری که طول هر یک از این زنجیره نفر تقسیم بر 26. اما در نماد O بزرگ، این است که؟ چه چیزی است که واقعا؟ پس از آن واقعا فقط N، درست است؟ از آنجا که ما در گذشته گفته ام، اوه شما 26 تقسیم کنید. بله، در واقع آن را سریع تر است. اما در تئوری، آن را اساسا نمی که سریعتر. بنابراین ما به نظر نمی رسد که بسیار نزدیک تر به این جام مقدس. در واقع، این فقط زمان خطی است. هک، در این نقطه، چرا ما نمی فقط استفاده از یکی از بزرگ لیست پیوندی؟ چرا ما فقط استفاده از یک بزرگ آرایه برای ذخیره نام هر کس در اتاق؟ خوب، هنوز هم وجود دارد چیزی قانع کننده در مورد یک جدول هش؟ آیا هنوز هم وجود دارد چیزی فوتی و فوری در مورد ساختار داده ها به نظر می رسد که این را دوست دارند؟ این. دانشجو: [نامفهوم]. SPEAKER 1: راست، و دوباره اگر آن را فقط یک الگوریتم زمان خطی، و زمان ساختمان داده خطی، چرا من نمی فقط نام همه را در یک بزرگ ذخیره آرایه، و یا در یک لیست بزرگ مرتبط است؟ و متوقف کردن ساخت CS بسیار سخت تر از آن نیاز دارد باشد؟ چه در این مورد قانع کننده است، حتی هر چند من آن را خراشیده؟ دانشجو: [نامفهوم]. SPEAKER 1: درج نیستند؟ گران قیمت دیگر. بنابراین اضافه بالقوه هنوز هم می تواند زمان ثابت، حتی اگر داده های شما ساختار به نظر می رسد مثل این، آرایه ای از اشاره گر، که هر کدام در اشاره به طور بالقوه یک لیست پیوندی. چگونه می تواند شما را ثابت رسیدن به درج زمان نام؟ استیک آن را در جلو، درست است؟ اگر ما به یک گل برای طراحی از قربانی پیشتر گفته شد، جایی که ما می خواستیم برای حفظ نام هر کس به عنوان مثال، طبقه بندی شده اند، و یا همه اعداد در مرحله طبقه بندی شده اند، فرض کنید که ما لیست نامرتب مرتبط است. این فقط ما هزینه های یک یا دو مرحله، می خواهم در مورد بن و برایان پیشتر گفته شد، برای درج یک عنصر در آغاز از لیست. بنابراین اگر ما در مورد مرتب سازی بر همه مهم نیست از نام شروع با یا همه نام با B شروع، ما هنوز هم می توانید دستیابی به قرار دادن زمان ثابت. در حال حاضر به دنبال آلیس و باب و یا هر نام به طور کلی هنوز چه؟ O بزرگ از n تقسیم بر 26، در حالت ایده آل که در آن هر کس یکنواخت توزیع شده، که در آن به عنوان بسیاری وجود دارد به عنوان Z، که احتمالا وجود دارد غیر واقعی است. اما این هنوز خطی است. اما در اینجا، ما آمده ایم به نقطه نماد مجانبی از لحاظ نظری درست است. اما در دنیای واقعی، اگر من ادعا می کنند که برنامه من می تواند به چیزی 26 بار انجام سریع تر از شما، که برنامه می خواهید برای ترجیح می دهند با استفاده از؟ شما یا من، که 26 برابر سریعتر؟ در واقع، فردی که 26 است بار سریعتر، حتی اگر از لحاظ نظری الگوریتم های ما در همان اجرا شود مجانبی زمان در حال اجرا است. اجازه بدهید من پیشنهاد های مختلف راه حل در دسترس نباشد. و اگر این ذهن خود را منفجر کنید، ما از ساختارهای داده ای هستید. پس این است که آن درخت - نوع یک نام احمقانه. آن را از retrievals ها می آید، و کلمه درخت پیشوندی، T-R--E، املای دلیل بازیابی البته برای تلفن های موبایل مانند درخت است. اما این تاریخ درخت پیشوندی کلمه. بنابراین یک درخت پیشوندی است که در واقع نوعی از درخت، و آن را نیز بازی در آن کلمه است. و حتی شما می توانید کاملا آن را ببینید با این تجسم، یک درخت پیشوندی است درخت ساختار، مانند یک درخت خانواده با یک جد در بالا و تعداد زیادی نوه و نوه بزرگ به عنوان برگ در پایین. اما هر گره در درخت یک آرایه است. و آن را در یک آرایه - و اجازه ساده برای یک لحظه - آن را آرایه، در این مورد، اندازه 26، که در آن هر گره دوباره مجموعه ای از اندازه 26، که در آن عنصر صفر در آن آرایه نشان دهنده، و آخرین عنصر در هر یک از چنین آرایه نشان دهنده زهرا بنابراین پیشنهاد می کنم، پس، که این داده ها ساختار، شناخته شده به عنوان یک درخت، می تواند استفاده می شود همچنین برای ذخیره کلمات. ما یک لحظه پیش دیدم که چگونه ما می تواند ذخیره کلمات، و یا در این مورد نام، و ما قبلا دیدم که چگونه ما می توانیم اعداد را ذخیره، اما اگر ما تمرکز بر روی نام و یا رشته در اینجا، متوجه چه چیزی جالب است. من ادعا می کنند که نام ماکسول است در داخل این ساختار داده ها. از کجا می توانم ماکسول می بینید؟ دانشجو: [نامفهوم]. SPEAKER 1: در سمت چپ. پس چه جالب با این داده ها ساختار است و نه از فروشگاه رشته M-A-X-W-E-L-L بک اسلش صفر، تمام contiguously، آنچه که شما به جای انجام شرح زیر است. اگر این درخت مانند ساختار داده است، هر یک از گره ها که دوباره یک آرایه، و شما می خواهید برای ذخیره ماکسول، برای بار اول شما شاخص و غیره گره ریشه است، به طوری به صحبت می کنند، گره بالاترین، در محل M، درست است، بنابراین تقریبا به عمق دفاع حریف. و سپس از آنجا، شما به دنبال یک اشاره گر به گره های یک کودک، پس به صحبت می کنند. بنابراین در مفهوم شجره نامه، شما به دنبال آن رو به پایین است. و به شما که منجر به گره دیگر در سمت چپ وجود دارد، که فقط یکی دیگر از آرایه. و پس از آن اگر شما می خواهید برای ذخیره ماکسول، شما در پیدا کردن اشاره گر است که نشان دهنده A، که این یکی در اینجا است. سپس شما به گره بعدی بروید. و توجه کنید - این است که چرا تصویر یک فریب کمی - این گره نگاه فوق العاده کوچک است. اما به حق این Y و Z. است به این فقط نویسنده کوتاه است تصویر به طوری که شما در واقع چیز را ببینید. در غیر این صورت به این تصویر خواهد بود بسیار گسترده ای است. بنابراین در حال حاضر شما شاخص به محل X، پس از آن W، E، L، L. سپس چه این کنجکاوی؟ خوب، اگر ما با استفاده از این نوع جدید را در چگونه برای ذخیره یک رشته در ساختار داده ها، شما هنوز هم نیاز به اساسا چک کردن در داده ها ساختار که یک کلمه در اینجا به پایان می رسد. به عبارت دیگر، هر یک از این گره ها به نحوی به خاطر داشته باشید که ما در واقع به دنبال این اشاره گر و در حال ترک کمی نان خرده نان در پایین در اینجا از این ساختار برای نشان دادن M-A-X-W-E-L-L در واقع در این ساختار داده ها. بنابراین ما ممکن است این کار را به شرح زیر انجام دهید. هر یک از گره که در تصویر ما فقط اره یک، آرایه ای از اندازه 27 است. و آن را در حال حاضر 27، چرا که در ص شش، ما در واقع به شما در مواقع حذف حرف یا بخشی از کلمه را، بنابراین ما می توانیم به نامهایی چون انتشارات O'reilly به و دیگران با آپوستروف. اما همین ایده. هر یک از این عناصر در آرایه به یک struct گره، بنابراین فقط یک گره است. پس این است که بسیار یادآور لیست پیوندی ما. و پس از آن من بولی، که من کلمه تماس، است که فقط برای رفتن به درست اگر یک کلمه به پایان می رسد در این گره در درخت است. این به طور موثر نشان دهنده کمی مثلث ما یک لحظه پیش دیدم. بنابراین اگر یک کلمه به پایان می رسد که در آن گره در درخت، که فیلد کلمه درست باشد، است که مفهومی چک کردن، یا ما در حال رسم این مثلث، بله وجود دارد یک کلمه در اینجا است. بنابراین این درخت است. و در حال حاضر سوال این است که، چه زمان در حال اجرا است؟ آیا آن بزرگ O N؟ آیا چیز دیگری است؟ خوب، اگر شما نفر نام در این داده ها ساختار، ماکسول تنها یکی از آنها، چه زمان در حال اجرا است قرار دادن یا پیدا کردن ماکسول؟ زمان در حال اجرا قرار دادن ماکسول؟ اگر نامهای نفر دیگر وجود دارد در حال حاضر در جدول؟ آره؟ دانشجو: [نامفهوم]. SPEAKER 1: آره، آن را به طول نام، درست است؟ بنابراین M-X-W-E-L-L تا آن را مانند این احساس می کند الگوریتم O بزرگ از هفت است. در حال حاضر، البته، نام در طول متفاوت خواهد بود. شاید آن یک نام کوتاه است. شاید آن یک نام دیگر است. اما آنچه کلیدی در اینجا این است که آن یک عدد ثابت است. و شاید آن را واقعا ثابت نیست، اما خدا، اگر در واقع، در یک فرهنگ لغت، احتمالا وجود دارد برخی از محدودیت در تعداد حروف در نام فرد در یک کشور خاص. و بنابراین ما می توانیم فرض کنیم که ارزش ثابت است. من نمی دانم آنچه در آن است. این احتمالا بزرگتر از ما فکر می کنیم آن است. از آنجا که همیشه برخی از گوشه وجود دارد با نام دیوانه طولانی. بنابراین اجازه دهید آن را K می نامند، اما هنوز هم ثابت احتمالا، زیرا هر نام در جهان، حداقل در کشور خاص، این است که طول یا کوتاه تر، پس از آن ثابت است. اما هنگامی که ما گفته ایم چیزی بزرگ است O یک مقدار ثابت، چه که واقعا معادل؟ این واقعا همان چیزی است عنوان کرد و گفت زمان ثابت است. در حال حاضر ما نوع تقلب هستید، درست است؟ ما نوع از اعمال نفوذ برخی از نظریه در اینجا می گویند که خوب، منظور از k است واقعا فقط یک سفارش از، زمان و ثابت آن است. اما واقعا است. از آنجا که بینش کلیدی در اینجا این است که اگر ما نفر نام در حال حاضر در این ساختار داده ها، و ما درج ماکسول، مدت زمانی که طول می کشد تا درج ماکسول در همه آسیب دیده که چگونه بسیاری از مردم در ساختار داده ها هستند؟ به نظر نمی رسد. اگر من تا به حال یک میلیارد عناصر بیشتر به این درخت پیشوندی، و سپس وارد ماکسول، او در همه تحت تاثیر قرار می گیرد؟ شماره و این بر خلاف هر یک از داده های روز ساختار ما را دیده ام تا کنون، که در آن زمان اجرای الگوریتم خود را به طور کامل مستقل از اینکه چقدر مسائل است و یا در حال حاضر نیست در این ساختار داده ها. و به همین ترتیب با این می توان شما در حال حاضر است فرصت برای P مجموعه شش، که خواهد شد دوباره شامل اجرای خود را غلطیاب املایی، خواندن در 150،000 کلمات، چگونه بهترین برای ذخیره آن لزوما آشکار نیست. و اگر چه من آرزو کردم برای پیدا کردن جام مقدس، من نمی ادعا می کنند که یک درخت پیشوندی است. در واقع، جدول هش ممکن است به خیلی خوب اثبات بسیار کارآمد تر است. ولی برای کسانی که فقط - این فقط یکی از تصمیم گیری های طراحی شما باید مطمئن. اما در بسته اجازه دهید 50 یا بیشتر ثانیه را زیرچشمی نگاه کردن در چه نهفته است پیش هفته آینده و فراتر از آن ما گذار از این خط فرمان اگر برنامه C به چیزهایی وب و بر اساس زبان مانند پی اچ پی و جاوا اسکریپت و اینترنت به خودی خود، پروتکل ها مانند HTTP، که شما باید گرفته شده برای سال اعطا شده در حال حاضر، و تایپ شده در هر روز، شاید، و یا دیده می شود. و ما را به پوست پشت شروع لایه هایی از آنچه اینترنت است. و آنچه را که کد این است که زمینه ابزار و امروز. پس از 50 ثانیه از این تیزر به اینجا. من تو را رزمندگان خالص را. [پخش ویدئو] او با پیام آمد. با استفاده از یک پروتکل خود را. او به جهان از فایروال بی رحمانه، uncaring روتر، و خطرات دور بدتر از مرگ است. او سریع است. او قوی است. او TCPIP است. و او آدرس خود را. رزمندگان خالص. [END پخش ویدئو] SPEAKER 1: این است که چگونه اینترنت باید به عنوان هفته آینده کار می کنند.