<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Parsa Mehdipour</title>
        <link>https://virgool.io/feed/@mehdipourparsa</link>
        <description>Back-End Developer</description>
        <language>fa</language>
        <pubDate>2026-06-16 20:08:27</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/758501/avatar/qq0lZ4.jpg?height=120&amp;width=120</url>
            <title>Parsa Mehdipour</title>
            <link>https://virgool.io/@mehdipourparsa</link>
        </image>

                    <item>
                <title>ساختار داده : قسمت سوم</title>
                <link>https://virgool.io/@mehdipourparsa/%D8%B3%D8%A7%D8%AE%D8%AA%D8%A7%D8%B1-%D8%AF%D8%A7%D8%AF%D9%87-%D9%82%D8%B3%D9%85%D8%AA-%D8%B3%D9%88%D9%85-kepsweutmh71</link>
                <description>در این قسمت میخوام عملیات جستجو کردن که بر روی ساختار های داده (فعلا آرایه) انجام میشه رو بررسی کنم پس با من همراه باشید.جستجو کردن(Search) :عملیات جستجو بر روی آرایه ها به این معناست که بگردیم و ببینیم که آیا یک مقدار(value) مشخص در آرایه موجود هست یا نه. و اگر موجود بود در چه موقعیتی(index) قرار دارد.یک جورایی معکوس عملیات خواندن(Read) میشه. چون عملیات خواندن به این معناست که ما یک موقعیت(index) رو به کامپیوتر معرفی میکنیم و مقدار(value) موجود در اون موقعیت(index) رو میخونیم. ولی در عملیات جستجو(Search) ما یک مقدار(value) رو به کامپیوتر معرفی میکنیم و موقعیت(index) ای که آن مقدار(value) در آن قرار دارد رو ازش میخوایم.این دو عملیات (خواندن و جستجو کردن) ممکن هست شبیه به هم به نظر برسند ولی دنیایی تفاوت از نظر کارایی(efficiency) بینیشون قرار داره.خواندن(Read) از یک موقعیت(index) مشخص سریع هست، به دلیل اینکه کامپیوتر به راحتی میتونه وارد یک موقعیت(index) بشه و مقدارش(value) رو بخونه. ولی جستجو کردن(Search) کسل کننده هست، چون که کامپیوتر این قابلیت رو نداره که بتونه مستقیما وارد یک مقدار(value) بشه.این یک نکته مهمی هست : کامپیوتر دسترسی مستقیم به تمامی memory address های خودش داره. ولی هیچ اطلاعی از مقادیری که در آنها ذخیره شده نداره.مثال خودمون رو در نظر بگیریم که در قسمت های قبل داشتیم که آرایه ای از میوه ها بود. به عنوان مثال کامپیوتر نمیتونه در اصل مقادیر موجود در هر سلول رو ببینه. برای کامپیوتر آرایه ما چیزی شبیه به شکل زیر هست.برای جستجو کردن یک میوه در آرایه ما، کامپیوتر راهی نداره جز اینکه دونه به دونه سلول هارو بررسی بکنه.حالا باهم تمام مراحلی که کامپیوتر برای جستجو کردن(Search) مقدار &quot;dates&quot; انجام میده رو بررسی میکنیم. برای یادآوری آرایه موردنظرمون رو دوباره براتون میارم.اول از همه کامپیوتر موقعیت(index) 0 رو چک میکنه:به دلیل اینکه مقدار موجود در موقعیت 0 برابر با &quot;apples&quot; هست و با مقدار ای که ما مد نظرمون داریم برابر نیست، کامپیوتر وارد موقعیت بعدی میشه:موقعیت 1 مقدار &quot;dates&quot; رو درخودش نداره پس وارد موقعیت 2 میشیم:و دوباره هم مقدار مورد نظرمون در این موقعیت قرار ندارد پس وارد موقعیت بعدی میشیم:بالاخره پیدا شد!! ، در نتیجه کامپیوتر مقدار &quot;dates&quot; رو پیدا کرد و میدونه که در موقعیت 3 قرار داره. از اینجا به بعد کامپیوتر دیگه نیاز نداره که وارد موقعیت بعدی بشه چون مقدار مورد نظرمون پیدا شده.در این مثال چون کامپیوتر برای پیدا کردن &quot;dates&quot; مجبور بود که 4 تا سلول(cell) رو بررسی بکنه تا این مقدار پیدا بشه، میتونیم بیان کنیم که این عملیات مشخص در مجموع 4 قدم(step) برداشته.این مدل از جستجو کردن که در آن کامپیوتر مجبور به چک کردن دونه به دونه سلول(cell) ها هست، معروف به جستجوی linear هست(linear search).و حالا یک سوال : بیشترین تعداد قدمی(step) که یک کامپیوتر برای انجام linear search نیاز داره برداره چندتا هست ؟اگر مقداری(value) که ما دنبالش هستیم در آخرین سلول(cell) قرار داشته باشه (به عنوان مثال &quot;elderberries&quot;)، در نهایت کامپیوتر مجبور به بررسی کردن تمام سلول های آرایه هست تا زمانی که این مقدار رو پیدا کنه. همچنین اگر این مقدار اصلا در آرایه ما قرار نداشته باشه باز هم کامپیوتر مجبور به بررسی کردن تمام سلول ها میشه تا مطمئن بشه که این مقدار در آرایه وجود نداره.پس نتیجه میگیریم که برای یک آرایه ای با 5 عضو بیشترین تعداد قدم(step) هایی که برای یک linear search برداشته میشه برابر هست با 5، و برای یک آرایه ای با 500 عضو برابر هست با 500.راه دیگه برای بیان این جمله به صورت زیر هست:برای آرایه ای با N عضو بیشترین قدم(step) هایی که یک linear search برمیداره برابر هست با N.به همین دلیل هست که جستجو کردن(Search) کارآمدی(efficiency) کمتری نسبت به خواندن(Read) داره، چون یک جستجو ممکن هست که تعداد قدم(step) های زیادی برداره ولی خواندن همیشه در یک قدم(step) انجام میشه و اندازه آرایه اصلا در آن مهم نیست.</description>
                <category>Parsa Mehdipour</category>
                <author>Parsa Mehdipour</author>
                <pubDate>Sun, 30 Oct 2022 21:53:53 +0330</pubDate>
            </item>
                    <item>
                <title>ساختار داده : قسمت دوم</title>
                <link>https://virgool.io/@mehdipourparsa/%D8%B3%D8%A7%D8%AE%D8%AA%D8%A7%D8%B1-%D8%AF%D8%A7%D8%AF%D9%87-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-kcpnmc1c5yma</link>
                <description>در قسمت قبلی یک توضیح مختصری راجع به داده و ساختار داده به شما دادم و شما رو با یکی ساختار های داده به اسم آرایه آشنا کردم و اصطلاحات فنی مربوط به آن رو هم به شما گفتم.در این قسمت میخوام بپردازم به عملیات هایی که روی یک ساختار داده انجام میشه پس با من همراه باشید.عملیات های مربوط به ساختار داده ( Data Structure Operations ) :برای اینکه performance یک ساختار داده رو بررسی کنیم - به عنوان  مثال آرایه - ما نیاز داریم که تعامل های عادی کدمون رو با آن ساختار داده آنالیز کنیم.بیشتر ساختار های داده برای چهار عمل ساده استفاده میشن:خواندن ( Read )جستجو کردن ( Search )افزودن ( Insert )حذف کردن ( Delete )در ادامه به بررسی تک تک آنها خواهم پرداخت.ولی قبل از بررسی این عملیات ها یک نکته ی مهم باید گفته بشه!بررسی سرعت :یک سوال : ما چطور سرعت یک عملیات رو بررسی میکنیم ؟یک نکته ی خیلی مهمی که وجود داره این هستش که :وقتی که ما سرعت یک عملیات رو بررسی میکنیم ما به اینکه از لحاظ زمانی آن عملیات چقدر طول میکشد اشاره نداریم بلکه به تعداد قدم هایی ( steps ) که برای انجام آن عملیات طی میشه اشاره داریمدلیل این کارمون هم این هست که فرضا یک قطعه کد در طول 5 ثانیه روی یک کامپیوتر میان رده اجرا شده ولی همان قطعه کد روی یک کامپیوتر قدیمی تر طی 20 ثانیه اجرا شده و بر روی یک ابرکامپیوتر طی صدم ثانیه اجرا شده.اندازه گیری سرعت اجرای یک کد بر اساس زمان طی شده وابسته به سخت افزاری هست که روی آن اجرا میشه.برای حل این مشکل ما میتونیم سرعت اجرای یک کد را بر اساس تعداد قدم های برداشته شده ( steps ) محاسبه کنیم.فرضا عملیات یک برای اجرا شدن 5 قدم رو طی میکند و عملیات دو برای اجرا شدن 500 قدم رو طی میکند، در این صورت همیشه عملیات یک از عملیات دو روی هر کامپیوتری سریع تر هست .با این دید بر میگردیم به بررسی عملیات ها.خواندن ( Read ) :این عملیات زمانی رخ میده که ما بخوایم یک مقدار رو از آرایه در موقعیت ( index ) مشخص بخوانیم.به عنوان مثال ما میخوایم که مقدار موجود در موقعیت ( index ) 1 رو بخوانیم که برابر میشه با &quot;bananas&quot;.یک کامپیوتر همیشه عملیات خواندن از روی یک آرایه رو در یک قدم ( step ) انجام میده.ولی چطور کامپیوتر این کار رو در یک قدم انجام میده؟!حافظه ( memory ) یک کامپیوتر را میشه مثل یک مجموعه خیلی بزرگی از سلول ها در نظر گرفت، که بعضی هاشون پر و بعضی هاشون خالی هستن.زمانی که برنامه در خودش یک آرایه رو میسازه کامپیوتر یک ردیف پشت سر همی از این سلول هارو برای آن آرایه اشغال میکنه.به عنوان مثال برای یک آرایه ای که 5 عضو رو در خودش نگهداری میکنه کامپیوتر 5 سلول پشت سر هم و خالی رو برای آن آرایه اشغال میکنه و در دسترس برنامه قرار میده.هر سلول موجود در حافظه کامپیوتر یک آدرس بخصوصی داره ( memory address ) که با یک عدد نشان داده میشه و آدرس هر سلول یک عدد از سلول قبلی بزرگ تره.حالا دوباره آرایه موجود خودمون رو میبینیم :اینکه کامپیوتر هر مقداری رو در موقعیت ( index ) مشخص میتونه در یک قدم ( step ) بخونه به دلیل های زیر هست.1.یک کامپیوتر میتونه مستقیما وارد هر سلول با آدرس خاص خودش ( memory addres ) در یک قدم ( step ) بشه. ( مثلا در یک قدم میتونه وارد سلول با آدرس 1063 بشه و مقدارشو بخونه )در اصل این امر مثل این هستش که به شما گفته بشه انگشت کوچک دست راستتون رو بالا بیارید!ایا برای بالا آوردن این انگشت کل انگشتان دستتون رو میگردید!؟؟!2.زمانی که کامپیوتر برای یک آرایه در حافظه ( memory ) فضا اشغال میکنه، همیشه آن آدرسی ( memory address ) که آرایه شروع شده رو میدونهبنا به این دو دلیل کامپیوتر همیشه مقدار اولین عنصر آرایه رو در یک قدم ( step ) میخونه.ولی اگر مقدار مورد نظر ما در وسط آرایه یا یک موقعیت ( index ) دیگه ای باشه چی؟؟خب جواب این سوال خیلی سادست از اونجایی که کامپیوتر آدرس ( memory address ) اولین عنصر آرایه رو میدونه خیلی ساده با افزودن به عدد آن ادرس مقدار عنصر مورد نظر مارو میخونه.فرض کنید که آرایه ما از ادرس ( memory address ) 1010 شروع شده باشه و ما بخوایم مقدار عنصر موجود در موقعیت ( index ) 3 رو بخونیم.شروع آرایه از آدرس ( memory address ) 1010 هست.موقعیت ( index ) 3 در اصل 3 سلول بعد از شروع آرایه هستدرنتیجه مقدار عنصر ما در آدرس ( memory address ) 1013 قرار داردبه دلیل اینکه خواندن از روی آرایه تنها در یک قدم انجام میشه پس این عملیات پرفورمنس ( performance ) بالایی داردپس به طور طبیعی عملیاتی که در یک قدم انجام شود بالاترین سرعت رو دارد.</description>
                <category>Parsa Mehdipour</category>
                <author>Parsa Mehdipour</author>
                <pubDate>Fri, 16 Sep 2022 13:41:10 +0430</pubDate>
            </item>
                    <item>
                <title>ساختار داده : قسمت اول</title>
                <link>https://virgool.io/@mehdipourparsa/%D8%B3%D8%A7%D8%AE%D8%AA%D8%A7%D8%B1-%D8%AF%D8%A7%D8%AF%D9%87-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-rgsgcsn8rbtn</link>
                <description>چند روزی میشه که شروع به خواندن کتاب &quot;common sense guide to data structures and algorithms&quot; از آقای Jay Wengrow کردم، و دوست داشتم در طول مطالعه خودم چیز های جدیدی را که یاد میگیرم با شما دوستان ویرگولی خودم به اشتراک بزارم.اصلا ساختار داده چی هست!؟قبل از اینکه به تعریف ساختار داده بپردازیم اول ببینیم که &quot;داده&quot; به چه چیزی گفته میشه؟داده در اصل اصطلاحی هست که به هرگونه اطلاعات(Information) گفته میشه. چه این اطلاعات از نوع عدد(int) باشه یا متن(string).حال یک تعریفی از ساختار داده:خیلی ساده بخوایم بگیم ساختار داده اشاره داره به نحوه سازمان دهی اطلاعات(data)به عنوان مثال ما به دو روش میتونیم سه تا متن رو چاپ کنیم.حالت اول : x = &amp;quotHello! &amp;quot
 y = &amp;quotHow Are You&amp;quot
 z = &amp;quotToday?&amp;quot

print x + y + zدر این حالت اگر بخواهیم که نحوه سازماندهی داده را توصیف کنیم باید بگیم که ما سه عدد متن(string) غیر وابسته به هم داریم که هر کدوم در یک متغیر جدا ذخیره شده.حالت دوم : array = [ &amp;quotHello! &amp;quot, &amp;quotHow Are You &amp;quot, &amp;quotToday?&amp;quot ]
 print array[ 0 ] + array[ 1 ] + array[ 2 ]دو قطعه کد بالا با هم تفاوتی ندارن فقط به صورت متفاوتی سازماندهی شدن.نحوه سازماندهی داده های شما تاثیر مستقیمی بر سرعت اجرا شدن برنامه تون داره ، پس مطالعه راجع به این موضوع خالی از لطف نیست. اگر برنامه شما با اطلاعات زیادی سروکار داره و یا اینکه توسط هزاران کاربر استفاده میشه سازماندهی بد ممکن هست باعث اجرا نشدن برنامه تون بشه.در ادامه میخوام شمارو با اولین ساختار داده آشنا بکنم.آرایه : ساختار داده بنیادینآرایه(Array) یکی از ابتدایی ترین ساختار داده های موجود در علم کامپیوتر هست، همونطور که میدونید آرایه یک لیستی از داده هست و در خیلی از موقعیت ها میشه ازش استفاده کرد.یک نمونه از آرایه رو مشاهده میکنید:array = [ &amp;quotapples&amp;quot, &amp;quotbananas&amp;quot, &amp;quotcucumbers&amp;quot, &amp;quotdates&amp;quot, &amp;quotelderberries&amp;quot ]به عنوان مثال این آرایه دارای 5 استرینگ هست.آرایه ها اصطلاحات فنی خودشون رو هم دارن:اندازه(size) : اندازه یک آرایه برابر هست با تعداد عناصری که در خودش داره به عنوان مثال اندازه آرایه بالا 5 هست.موقعیت(index) : موقعیت هر آرایه عددی هست که نشان دهنده ی مکان یک عنصر در آرایه هست.در بیشتر زبان های برنامه نویسی شمارش آرایه ها از صفر شروع میشه.</description>
                <category>Parsa Mehdipour</category>
                <author>Parsa Mehdipour</author>
                <pubDate>Wed, 14 Sep 2022 20:01:22 +0430</pubDate>
            </item>
            </channel>
</rss>