ساختمان داده مقدماتی
ساختمان داده یعنی شکلی که چند چیز را کنار هم در آن نگه می دارید، و انتخابش در واقع انتخاب این است که بعدا چه سوالی از این داده سریع جواب بگیرد. سه شکلی که نود درصد کار روزمره را می پوشانند فهرست، دیکشنری و مجموعه اند و تفاوتشان در آنچه ذخیره می کنند نیست، در آنچه ارزان پیدا می کنند است.
- درس ۸ از ۱۴
- مقدماتی
- رایگان، بدون ثبت نام
انتخاب ساختمان داده، از روی سوالی که بعدا می پرسید
-
ترتیب
فهرست
اگر جای دو عضو عوض شود معنا عوض می شود؟ پس ترتیب خودش اطلاعات است.
-
کلید
دیکشنری
با یک اسم مشخص سراغ یک چیز مشخص می روید؟ کلید برخلاف شماره، جا به جا نمی شود.
-
عضویت
مجموعه
فقط می خواهید بدانید هست یا نه؟ در ضمن تکراری ها را همان لحظه ورود حذف می کند.
-
ثابت
تاپل
همان فهرست، با این تضمین که بعد از ساخته شدن عوض نمی شود.
این چهار شکل همه شان می توانند همان داده را نگه دارند. تفاوتشان در چیزی است که ارزان پیدا می کنند، نه در چیزی که ذخیره می کنند.
آخرین بررسی: فکت ها و نام ابزارهای این درس در همین تاریخ با منابعشان بازبینی شده اند.
ساختمان داده یعنی چه و چرا انتخابش اهمیت دارد؟
ساختمان داده شکلی است که چند چیز را کنار هم در آن نگه می دارید. تا اینجا ساده به نظر می رسد و همین سادگی باعث می شود اهمیتش دیده نشود: بیشتر تازه کارها فکر می کنند انتخاب بین این شکل ها سلیقه ای است، چون هر کدامشان می توانند همان داده را نگه دارند.
هر کدامشان واقعا می توانند. اسم صد نفر را می شود در یک فهرست گذاشت، می شود در یک دیکشنری گذاشت، و می شود در یک مجموعه گذاشت. تفاوت جای دیگری است: هر شکل یک سوال را ارزان جواب می دهد و بقیه سوال ها را گران.
پس قاعده ای که باید از این درس با خودتان ببرید این است. وقتی می خواهید تصمیم بگیرید داده را در چه شکلی نگه دارید، به خود داده نگاه نکنید؛ به سوالی نگاه کنید که قرار است بعدا از آن بپرسید. «عضو سوم کدام است» یک سوال است، «مقدار این کلید چیست» سوال دیگری است، و «این چیز اصلا اینجا هست» سوال سومی است. سه سوال، سه شکل.
و برای اینکه انتظار درستی داشته باشید: انتخاب اشتباه معمولا برنامه را خراب نمی کند. برنامه کار می کند، فقط کد شما برای پرسیدن یک سوال ساده مجبور می شود کار زیادی بکند، و آن کار زیادی وقتی داده بزرگ می شود یا وقتی چیزی به آن اضافه می شود خودش را نشان می دهد. بخش آخر همین درس یک نمونه واقعی از همین حالت است.
فهرست: وقتی ترتیب خودش یک اطلاعات است
فهرست چند چیز پشت سر هم است که ترتیبشان حفظ می شود. همین حفظ شدن ترتیب، تنها چیزی است که فهرست را از بقیه جدا می کند و بیشتر از آنکه به نظر می رسد اهمیت دارد.
prices = [12000, 8000, 15000]
prices.append(9000)
print(prices[0])
print(len(prices))هر عضو یک شماره دارد که به آن شاخص می گویند، و شماره ها از صفر شروع می شوند نه از یک. پس prices[0] اولین قیمت است. این از صفر شروع شدن، دلیل تاریخی دارد و در تقریبا همه زبان های امروزی یکسان است، ولی برای همین هم منبع همان خطای یکی است که در درس شرط و حلقه دیدید.
فهرست وقتی درست است که ترتیب معنا داشته باشد: مراحل یک کار، نتایج یک جستجو به ترتیب رتبه، پیام های یک گفتگو. در همه اینها اگر جای دو عضو را عوض کنید، معنا عوض می شود، و همین نشانه است که فهرست انتخاب درستی است.
و یک ویژگی که در نگاه اول مزیت به نظر می رسد و بعدا هزینه می شود: شاخص یک عضو ثابت نیست. اگر عضو اول را حذف کنید، هر عضو بعدی یک پله جلو می آید و شاخصش عوض می شود. یعنی «عضو شماره سه» چیزی درباره خود آن عضو نمی گوید؛ فقط می گوید همین حالا کجای فهرست ایستاده. اگر جایی این شماره را نگه داشته باشید تا بعدا از آن استفاده کنید، همان جا یک باگ ساخته اید که هنوز اتفاق نیفتاده.
دیکشنری: وقتی کلید جای شماره را می گیرد
دیکشنری جفت هایی از کلید و مقدار است. به جای اینکه یک چیز را با شماره اش پیدا کنید، با اسمش پیدا می کنید. در زبان های مختلف اسم های مختلفی دارد، ولی ایده همان است.
user = {"name": "sara", "city": "shiraz"}
print(user["city"])
user["city"] = "tabriz"تفاوت مهمی که معمولا جا می ماند این است: وقتی می نویسید user["city"]، برنامه داخل دیکشنری نمی گردد. مستقیم می رود سر جای درست. اگر همین داده را در یک فهرست از جفت ها نگه داشته بودید، برای پیدا کردن شهر باید کل فهرست را از اول می خواندید تا به جفتی برسید که کلیدش شهر است.
روی سه عضو این تفاوت به چشم نمی آید. روی سه هزار عضو، و مخصوصا وقتی این جستجو خودش داخل یک حلقه باشد، همان تفاوت است که یک صفحه را کند می کند. و بیشتر کدهای کند که ما در سایت های مشتری ها دیده ایم دقیقا از همین جنس اند: جستجوی خطی داخل حلقه، جایی که یک کلید کافی بود.
ویژگی دومی که به همان اندازه مهم است: کلید عوض نمی شود. برخلاف شاخص فهرست که با حذف و اضافه جا به جا می شود، کلید همان کلید می ماند. اگر لازم دارید بعدا به یک عضو مشخص برگردید، این تنها ویژگی ای است که واقعا لازم دارید، و بخش آخر همین درس نشان می دهد این حرف در عمل چقدر جدی است.
شماره یا کلید؟ تفاوت وقتی معلوم می شود که داده عوض شود
فهرست: آدرس یک شماره است
شماره ها از صفر شروع می شوند
- شماره می گوید همین حالا کجای فهرست ایستاده
- با حذف یک عضو، هر شماره بعدی عوض می شود
دیکشنری: آدرس یک کلید است
کلید را خودتان انتخاب می کنید
- کلید می گوید این عضو کیست، نه کجاست
- هر چه اضافه یا حذف شود، کلید همان می ماند
و تفاوت اینجا خودش را نشان می دهد
پیدا کردن یک عضو مشخص
همان کاری که معمولا داخل یک حلقه انجام می شود
- در فهرست: از اول بخوان تا پیدا شود
- در دیکشنری: مستقیم سراغ کلید برو
روی داده ای که هیچ وقت عوض نمی شود، این دو تفاوتی ندارند و انتخاب واقعا سلیقه ای است. تفاوت از لحظه ای شروع می شود که چیزی حذف یا اضافه شود.
مجموعه: وقتی فقط می خواهید بدانید هست یا نه
مجموعه چند چیز یکتاست، بدون ترتیب مشخص. دو کار را خیلی خوب انجام می دهد و بقیه کارها را اصلا: تکراری ها را حذف می کند، و به سرعت جواب می دهد که یک چیز داخلش هست یا نه.
tags = {"seo", "speed", "seo"}
print(len(tags))
print("seo" in tags)خروجی خط سوم دو است نه سه، چون تکراری در همان لحظه ورود حذف شده. این رفتار همان چیزی است که مجموعه را مفید می کند و همان چیزی است که اگر حواستان نباشد داده تان را بی صدا کم می کند؛ اگر تکرارها برایتان معنا دارند، مجموعه شکل غلطی است.
حالا یک نمونه از دنیای واقعی، از کد همین سایت. PHP اصلا نوع داده ای به اسم مجموعه ندارد. پس وقتی به یک مجموعه احتیاج پیدا می کنیم، از آرایه ای می سازیمش که کلیدهایش همان چیزهایی اند که می خواهیم بشماریم و مقدارهایش هیچ اهمیتی ندارند:
$used = array();
// ... در حلقه ای که برای هر تیتر یک شناسه می سازد:
while ( isset( $used[ $id ] ) ) {
$id = $base . '-' . $n++;
}
$used[ $id ] = true;به مقدار true دقت کنید: هیچ جای برنامه خوانده نمی شود. چیزی که واقعا ذخیره شده خود کلید است، یعنی «این شناسه قبلا استفاده شده». این دقیقا تعریف مجموعه است، ساخته شده از ابزاری که در دسترس بوده. و علت اینکه اینجا فهرست به کار نمی آید همان علت بخش قبل است: isset مستقیم سراغ کلید می رود، ولی گشتن دنبال یک شناسه در فهرستی از شناسه ها یعنی خواندن کل فهرست، آن هم داخل حلقه ای که برای هر تیتر یک بار اجرا می شود.
کدام یک را کجا؟
سه شکل بالا به اضافه یکی که هنوز نامش نیامده، تاپل، تقریبا هر چیزی را که در سال اول لازم دارید پوشش می دهند. تاپل همان فهرست است با یک تفاوت: بعد از ساخته شدن عوض نمی شود. برای چیزهایی به کار می آید که ذاتا نباید تغییر کنند، مثل یک جفت طول و عرض جغرافیایی.
| شکل | ترتیب دارد؟ | تکرار می پذیرد؟ | سوالی که ارزان جواب می دهد |
|---|---|---|---|
| فهرست | بله | بله | عضو شماره سه کدام است؟ |
| دیکشنری | ترتیب افزودن | کلید تکراری نه | مقدار این کلید چیست؟ |
| مجموعه | خیر | خیر | این عضو اینجا هست؟ |
| تاپل | بله | بله | همان فهرست، ولی تضمین شده که عوض نمی شود |
ستون آخر مهم ترین ستون این جدول است و بقیه فقط توضیح آن هستند. اگر مطمئن نیستید کدام را انتخاب کنید، جمله ای را بنویسید که قرار است بعدا از این داده بپرسید و ببینید در کدام سطر می نشیند.
و یک موضع که با آموزش های معمول جور درنمی آید: در کار روزمره وب، دیکشنری بیشتر از فهرست به کار می آید و بیشتر از آن هم کمتر استفاده می شود. تازه کارها همه چیز را در فهرست می ریزند چون فهرست اولین چیزی است که یاد گرفته اند، و بعد برای پیدا کردن یک عضو داخل حلقه می گردند. اگر فقط همین یک عادت را عوض کنید، بخش خوبی از کدهای کندی که بعدا می نویسید اصلا نوشته نمی شوند.
یک تصمیم واقعی: چرا دفتر انتشار این درس ها فهرست نیست
همین بخش آموزشی که الان می خوانید، درس هایش یکی یکی و طبق یک برنامه منتشر می شوند: روزی سه درس، و به نوبت از میان شانزده مسیر. ترتیب این نوبت ها ذخیره نمی شود؛ هر بار از روی خود درس ها دوباره حساب می شود.
و همین جا یک مشکل واقعی هست. وقتی مسیری که هنوز خالی بوده پر می شود، درس های تازه اش وسط صف می نشینند و شماره هر درسی که بعد از آنها بوده یک پله جلو می رود. حالا فرض کنید دفتری که می گوید چه چیزی منتشر شده، فهرستی از شماره ها بود، یا حتی فقط یک عدد که می گفت پنج تای اول منتشر شده اند. درسی که دیروز منتشر شده بود، امروز بعد از جا به جا شدن صف دیگر جزو پنج تای اول نبود، از فهرست بیرون می افتاد و برای بازدیدکننده صفحه اش ۴۰۴ می شد.
پس دفتر یک دیکشنری است. کلیدش نشانی خود درس است و مقدارش لحظه ای که برای اولین بار منتشر شده. روزی که این درس بررسی شد، پنج کلید داشت و اولینشان این بود:
'seo/how-search-engines-work' => 1788539040حالا صف هر چقدر هم عوض شود، این کلید سر جایش می ماند، چون کلید از اول هم یک جایگاه در صف نبود؛ اسم خود درس بود. کل ماجرا در یک جمله: فهرست جواب می دهد که در جایگاه سوم چه چیزی هست، و دیکشنری جواب می دهد که این درس مشخص کی منتشر شد. فقط سوال دوم است که وقتی صف دوباره ساخته می شود همچنان معنا دارد.
این همان چیزی است که بخش اول این درس گفت، ولی این بار روی یک صفحه واقعی: انتخاب اشتباه برنامه را خراب نمی کرد. برنامه کار می کرد، فقط یک روز صبح چند صفحه منتشر شده بی صدا ناپدید می شدند.
صف که دوباره ساخته می شود، چه چیزی جا به جا می شود
-
۱
یک مسیر تازه پر می شود
چند درس تازه به بخش اضافه می شوند.
-
۲
صف دوباره حساب می شود
نوبت ها به ترتیب گردشی میان مسیرها چیده می شوند.
-
۳
درس های تازه وسط صف می نشینند
شماره هر درسی که بعد از آنها بوده یک پله جلو می رود.
-
۴
با فهرست: درس دیروز ناپدید می شد
دیگر جزو پنج تای اول نبود، پس از فهرست بیرون می افتاد و صفحه اش ۴۰۴ می شد.
-
۵
با کلید: هیچ چیز جا به جا نمی شود
کلید از اول هم یک جایگاه نبود؛ اسم خود درس بود.
این مسیر برای این بخش آموزشی واقعی است، ولی خطای آخرش هرگز اتفاق نیفتاد؛ دفتر از همان اول با کلید نوشته شد. اینجا نشان داده شده تا معلوم شود انتخاب اشتباه چه شکلی می شد.
مسیر سریع با هوش مصنوعی
کاری که در این موضوع واقعا سریع تر شده نوشتن یک فهرست یا دیکشنری نیست، چون آن هیچ وقت هم کند نبود. چیزی که سریع تر شده تشخیص این است که داده ای که همین حالا در برنامه تان هست، در شکل اشتباهی نگه داشته شده. این کار قبلا تجربه چند ساله می خواست و حالا یک پیام است، به شرطی که سوال را درست بپرسید: نپرسید «این کد را بهتر کن»، بپرسید «این داده در جواب چه سوال هایی استفاده می شود». کار قضاوت است، پس مدل قوی می خواهد؛ انتخاب فعلی ما میان مدل های کدنویسی، در بخش هوش مصنوعی همین سایت آمده است.
- جایی را که داده ساخته می شود و همه جاهایی را که خوانده می شود با هم کپی کنید. ساختمان داده را نمی شود از روی جای ساخته شدنش قضاوت کرد؛ سوالی که بعدا از آن پرسیده می شود تعیین کننده است و آن سوال جای دیگری نوشته شده.
- دستور زیر را بدهید و اول فقط جدول سوال ها را بخوانید، قبل از هر پیشنهادی. اگر در آن جدول سوالی دیدید که فکر نمی کردید برنامه تان بپرسد، همان جا بایستید؛ احتمالا تازه فهمیده اید کدتان چه کار می کند.
- پیشنهاد تغییر شکل را فقط وقتی قبول کنید که سوال متناظرش را در جدول دیده باشید. تغییر شکل داده ای که هیچ کس سوال گرانی از آن نمی پرسد، فقط ریسک است بدون هیچ سودی.
- بعد از تغییر، دنبال هر جایی بگردید که شماره یا جایگاه را جایی نگه داشته بود. این ها همان جاهایی اند که بی سر و صدا می شکنند، چون اگر شکل داده عوض شود شماره ای که ذخیره کرده بودید دیگر به همان عضو اشاره نمی کند.
نسخه آماده کپی
می خواهم بدانم داده زیر در شکل درستی نگه داشته شده یا نه. کد را عوض نکن.
جایی که داده ساخته می شود:
{کد را اینجا بگذارید}
جاهایی که خوانده می شود:
{همه جاهایی که این داده استفاده می شود را اینجا بگذارید}
اول، فقط یک جدول بده با این سه ستون و بدون هیچ توضیح دیگری:
| سوالی که کد از این داده می پرسد | کجا پرسیده می شود | برای جواب دادن چه کاری انجام می شود |
بعد از جدول:
۱. بگو کدام یک از این سوال ها گران جواب داده می شود، یعنی برای جوابش کل داده خوانده می شود.
۲. اگر شکل داده باید عوض شود، بگو به چه شکلی و کدام سطر جدول را ارزان می کند.
۳. اگر شکل فعلی درست است، همین را بگو و دلیلش را بنویس. جواب «همه چیز خوب است» هم جواب قابل قبولی است.
۴. فهرست کن کدام جاها به شماره یا جایگاه عضوها تکیه کرده اند و با تغییر شکل می شکنند.
اگر برای این کارها به کدی نیاز داری که ندادمش، بگو کدام؛ حدس نزن.
قبل از اعتماد به خروجی: بند سوم دستور عمدا آنجاست و اگر برش دارید، جواب همیشه یک پیشنهاد تغییر خواهد بود، چون از مدل پیشنهاد خواسته اید و او پیشنهاد می دهد. بیشتر داده های یک برنامه واقعی در شکل درستی هستند و عوض کردنشان فقط ریسک است. و بند چهارم هم بی دلیل نیست: تنها چیزی که یک تغییر شکل داده را بی سر و صدا خراب می کند، جایی است که شماره یک عضو را ذخیره کرده و بعد از تغییر، آن شماره به عضو دیگری اشاره می کند. تا وقتی خودتان آن جاها را ندیده اید، تغییر را اعمال نکنید.
هوش مصنوعی در این کار
ساختن یک فهرست یا دیکشنری چیزی نیست که مدل زبانی در آن اشتباه کند؛ این ساختارها آنقدر در داده آموزش تکرار شده اند که تولیدشان دیگر مهارت نیست. کاری که برای شما می ماند جای دیگری است: تشخیص اینکه داده ای که همین حالا دارید در شکل درستی نگه داشته شده یا نه، و این تشخیص نه از روی خود داده بلکه از روی سوال هایی که کد از آن می پرسد ممکن است. موضع ما این است که مدل را برای شمردن این سوال ها به کار بگیرید، نه برای پیشنهاد دادن ساختار: شمردن کاری است که او خوب انجام می دهد و شما حوصله اش را ندارید؛ انتخاب کردن کاری است که او فقط با دیدن یک بخش از برنامه انجام می دهد و شما کل برنامه را می شناسید.
ابزارهایی که واقعا کمک می کنند
- Claude Code برای این موضوع مناسب ترین است، چون سوال «این داده کجاها خوانده می شود» فقط با دیدن کل مخزن جواب دارد و یک تکه کد کافی نیست. خودش رایگان نصب می شود ولی بدون اشتراک کلود یا حساب کنسول انتروپیک کار نمی کند، و ایران در فهرست کشورهای پشتیبانی شده نیست.
- Claude وقتی کد را خودتان کپی می کنید انتخاب خوبی است و برای ساختن همان جدول سوال ها که در مسیر سریع آمده جواب می دهد. ایران در هیچ یک از دو فهرست کشورهای پشتیبانی شده انتروپیک نیست؛ این را از صفحه خود انتروپیک خوانده ایم و نه از تست شبکه.
- Gemini حالت درس خواندنش به اسم Guided Learning به جای دادن جواب سوال می پرسد، و برای جا افتادن تفاوت شاخص و کلید که هسته این درس است بهتر از گرفتن جواب آماده جواب می دهد. صفحه خود گوگل می گوید اپ وب جمنای در بیش از دویست و سی کشور و منطقه کار می کند و ایران در آن فهرست نیست.
کجا نتیجه معکوس می دهد
خطر مشخص این موضوع را در عمل زیاد دیده ایم: اگر بپرسید «این کد را بهتر کن»، مدل تقریبا همیشه پیشنهاد تغییر ساختار می دهد، چون شما پیشنهاد خواسته اید و جواب «همه چیز خوب است» به نظرش جواب مفیدی نمی آید. ولی بیشتر داده های یک برنامه واقعی در شکل درستی هستند و تغییر دادنشان فقط ریسک اضافه می کند. راه بستن این خطر هم در همان دستور مسیر سریع نوشته شده: صریح بگویید که «تغییری لازم نیست» یک جواب قابل قبول است.
خطر دوم دقیق تر است. وقتی مدل پیشنهاد می دهد یک فهرست را به دیکشنری تبدیل کنید، معمولا فقط جایی را می بیند که داده ساخته می شود، نه همه جاهایی که خوانده می شود. اگر کدی جایی شماره یک عضو را ذخیره کرده باشد، آن کد بعد از تغییر بی سر و صدا به عضو اشتباهی اشاره می کند و هیچ خطایی هم تولید نمی شود. انتروپیک خودش این جنس اطمینان درباره چیزی که مدل ندیده را در مستنداتش توهم می نامد و راه های کم کردنش را توضیح می دهد. برای اینکه بدانید هر کدام از این ابزارها از ایران چطور قابل پرداخت است، راهنمای خرید را ببینید، و برای انتخاب فعلی ما میان مدل های کدنویسی، بهترین هوش مصنوعی برای کدنویسی.
منبع ها: Anthropic: reduce hallucinations Anthropic: supported countries Claude Code: overview and install Google: where the Gemini web app is available
حد این توصیه
این درس عمدا در حد کار روزمره نوشته شده و مرزش را صریح می گوییم. اول، هیچ جای این صفحه سراغ پیچیدگی محاسباتی و نماد O بزرگ نرفته ایم. جمله های «ارزان» و «گران» که خواندید توصیف اند نه اندازه گیری، و ما هیچ عددی درباره سرعت نمی دهیم چون روی این سرور نسنجیده ایمش. دوم، ساختارهای بعدی که در هر کتاب ساختمان داده می آیند اینجا نیستند: پشته، صف، درخت، گراف، و صف اولویت. هر کدامشان یک سوال مشخص را ارزان می کنند و روزی که به آن سوال بربخورید، خودتان می فهمید دنبال چه هستید. سوم، نام ها و تضمین ها بین زبان ها فرق می کند: در PHP یک نوع آرایه وجود دارد که هم فهرست است و هم دیکشنری، و در جاوااسکریپت شی و Map دو چیز جدا با رفتار متفاوت اند. و آخر اینکه این درس درباره داده ای است که در حافظه یک برنامه جا می شود؛ وقتی داده بزرگ تر از حافظه شود، بحث از ساختمان داده به پایگاه داده منتقل می شود که موضوع درس دیگری است.
از تجربه خود ما
هر دو نمونه ای که در این درس آمد از کد همین سایت است و روزی که این صفحه بررسی شد دوباره خوانده شد. اولی الگوی مجموعه ساخته شده از آرایه است: عبارت $used[ $id ] = true; در سه فایل قالب تکرار شده، در inc/editorial.php، inc/helpers.php و inc/diagram-posts.php، و در هر سه دقیقا بالای خودش یک while ( isset( $used[ $id ] ) ) دارد. مقدار true در هیچ کدام از این سه جا خوانده نمی شود؛ چیزی که ذخیره شده خود کلید است. دومی دفتر انتشار همین بخش آموزش است: گزینه ای در پایگاه داده به اسم rgbl_announced که روز بررسی این درس پنج کلید داشت و شکلش دقیقا این است: نشانی درس به تایم استمپ. آنچه این دو مثال با هم نشان می دهند و در هیچ کتاب مقدماتی نوشته نمی شود این است که در عمل شما اغلب ساختمان داده را انتخاب نمی کنید، بلکه از ابزاری که زبانتان دارد می سازیدش؛ چیزی که واقعا انتخاب می کنید این است که آدرس هر عضو چه باشد، و همان انتخاب است که تعیین می کند وقتی داده عوض شد چه چیزی می شکند.
سوال هایی که واقعا پرسیده می شوند
فرق آرایه و فهرست چیست؟
در حرف روزمره یک چیزند و اسمشان به زبان بستگی دارد: پایتون به آن فهرست می گوید و جاوااسکریپت و PHP آرایه. اگر بخواهیم دقیق باشیم، در بعضی زبان ها آرایه اندازه ثابت دارد و فهرست می تواند بزرگ و کوچک شود. برای شروع لازم نیست نگران این تفکیک باشید؛ چیزی که مهم است این است که ترتیب حفظ می شود و آدرس هر عضو یک شماره است.
کی باید داده را از فهرست به دیکشنری تبدیل کنم؟
وقتی می بینید برای پیدا کردن یک عضو مشخص، دارید داخل یک حلقه دنبالش می گردید. آن حلقه همان جایی است که یک کلید کارتان را راه می اندازد. ولی اگر فقط از اول تا آخر داده رد می شوید و هیچ وقت یک عضو خاص را جدا نمی خواهید، فهرست همان چیزی است که لازم دارید و عوض کردنش فقط ریسک است.
برای شروع باید ساختمان داده و الگوریتم را جدی بخوانم؟
برای شروع نه. همین سه شکل به اضافه دانستن اینکه هر کدام چه سوالی را ارزان جواب می دهند، سال اول کار عملی را پوشش می دهد. مطالعه جدی تر دو جا لازم می شود: وقتی داده تان بزرگ شود و کندی واقعی ببینید، و وقتی برای مصاحبه شغلی آماده می شوید، که آن دومی متاسفانه ربط کمی به کار روزمره دارد.