بایگانی دسته بندی ها: فنی

حلقه While

حلقه While چیست؟

حلقه While (یا While Loop) در اغلب زبان های برنامه نویسی امروزی به عنوان یکی از پرکاربردترین حلقه های مبتنی بر شرط شناخته می‌شود و برای اجرای دنباله‌ای از دستورات به صورت تکراری تا زمانی که یک شرط مشخص صحیح باشد به کار می‌رود.

در حلقه های While شرط یا عبارتی که می‌بایست ارزیابی شود در ابتدای لوپ قرار می‌گیرد؛ به این ترتیب اگر شرط لوپ به هنگام اولین بررسی، صحیح نباشد دستورات بدنه حتی یک بار هم اجرا نمی‌شوند. درست برخلاف حلقه های Do While و Do Until که در آن‌ها برنامه نویس می‌تواند شرط را در انتهای لوپ قرار دهد که در چنین حالتی حداقل یک بار دستورات بدنه اجرا خواهند شد.

در تصویر زیر، یا کمک یک مثال ساده نحوه استفاده از حلقه While در زبان برنامه نویسی جاوا نمایش داده شده است. در این مثال، شرط x <= 5 به عنوان شرط لوپ به کار رفته است و بدنه آن شامل دو دستور است. در آغاز حلقه از آنجایی که مقدار متغیر x برابر با 1 است شرط حلقه صحیح بوده و دستورات بدنه برای اولین بار اجرا می‌شود. به این ترتیب مقدار کنونی متغیر x (یعنی 1) در خروجی نوشته می‌شود و یک واحد به آن افزوده می‌شود (x = 2). مجددا شرط Loop بررسی می‌شود و از آنجایی که همچنان x <= 5 برقرار است برای بار دوم دستورات آن اجرا می‌شوند. به همین ترتیب در انتهای تکرار پنجم، مقدار متغیر x برابر 6 می‌شود و با توجه به اینکه شرط به هنگام بررسی، نادرست خواهد بود درنتیجه تکرار ششم اجرا نخواهد شد و خروجی این قطعه برنامه اعداد 1 تا 5 خواهد بود.

حلقه While
نمونه‌ای از حلقه While به زبان جاوا

برخلاف مثال فوق لازم است بدانید همیشه تعداد تکرار دستورات یک حلقه While از پیش مشخص نمی‌باشد. به عنوان مثالی ساده ممکن است در برنامه ای از کاربر خواسته شود عددی زوج را وارد کند. در چنین حالتی اگر از While Loop استفاده شود باید تا زمانی که عدد دریافتی از کاربر فرد است مجددا از او خواسته شود عددی زوج را وارد کند. بنابراین شرط لوپ، فرد بودن عدد دریافتی از کاربر است و در عین حال مشخص نیست چند مرتبه کاربر، عددی نادرست (عدد فرد) وارد خواهد کرد.

در نتیجه به طور معمول از While Loop ها در مواقعی استفاده می‌شود که قرار است دستوراتی تا رسیدن به یک هدف مشخص (رسیدن به حالتی که شرط برقرار نباشد) تکرار شوند و در مواردی که می‌خواهیم دستورات به تعداد مشخص اجرا شوند غالبا از حلقه‌های For استفاده می‌شود.

توجه داشته باشید همانند دو نمونه‌ای که در تصویر زیر مشاهده می‌کنید می‌توان شرط (یا دستورات بدنه) را به شکلی تعیین نمود که برای همیشه، شرط حلقه برقرار باقی بماند که در این حالت، یک حلقه بی پایان (Infinite Loop) تشکیل می‌شود.

حلقه While بی پایان Infinite While Loop
دو نمونه While Loop بی پایان. در این دو مثال متغیر y و b هیچگاه تغییری نمی‌کنند و شرط همواره برقرار می‌ماند.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

اسنیپت Snippet

اسنیپت یا Snippet چیست؟

اسنیپت (Snippet) در حوزه برنامه نویسی رایانه به قسمتی کوچک از متن یا کدهای برنامه نویسی با قابلیت استفاده مجدد گفته می‌شود. معمولا اسنیپت ها در قالب واحدهای عملیاتی کوچک به ماژول‌های بزرگتر برنامه نویسی افزوده می‌شوند و از آن‌ها برای تسهیل برنامه نویسی و انجام اعمال پرکاربرد استفاده می‌شود.

برای استفاده از اسنیپت ها و مدیریت آن‌ها در برخی ویرایشگرهای متنی، محیط های یکپارچه توسعه و ویرایشگرهای سورس کد، قابلیت ویژه‌ای به نام مدیریت اسنیپت در نظر گرفته شده است. برنامه نویسان می‌توانند با کمک این قابلیت به جای تایپ مجدد یک قطعه کد پرکاربرد، آن را به صورت اسنیپت ذخیره کرده یا از اسنیپت‌های آماده استفاده نمایند و آنها را در هر مکانی از سورس کد برنامه که لازم است قرار دهند.

به عنوان مثالی از کاربردهای Snippet ها می‌توان به نمونه‌هایی اشاره کرد که برای انجام اعمالی مثل بازکردن یا ذخیره یک فایل، قرار دادن اطلاعات مربوط به توسعه دهنده در قالب یک کامنت یا ایجاد سریع یک حلقه for، ایجاد و تعیین فرمت ظاهری یک جدول هنگام طراحی قالب یک ایمیل و … مورد استفاده قرار می‌گیرند.

اسنیپت های استاتیک و داینامیک

اسنیپت های استاتیک (Static Snippet) اساسا شامل متون ثابتی هستند که کاربر می‌تواند آن‌ها را به همان صورتی که هستند در سند خود قرار دهد. در مقابل، اسنیپت های پویا یا داینامیک (Dynamic Snippet) علاوه بر متن ثابت، دارای المان‌های پویایی هستند که کاربر می‌تواند محتوای آنها را مشخص کند. ممکن است در برنامه نویسی مقدار این المان‌ها براساس محاسباتی که در یک تابع انجام شده است تعیین شود و یا از کاربر برنامه گرفته شود.

بخش‌هایی از یک Snippet که باید محتوایشان توسط کاربر فراهم شود با کمک نگه دارنده های مکان یا پلیس هولدرها (Placeholder) در Snippet مشخص می‌شوند. این بخش‌ها معمولا با استفاده از یک کاراکتر ویژه از مابقی متن اسنیپت متمایز می‌شوند. در ویرایشگرهای سورس کد با کمک یک جعبه گفتگو یا روش ساده دیگری این امکان برای برنامه نویس فراهم می‌شود تا مقادیری که باید در پلیس هولدرها قرار گیرد را مشخص نماید.

به عنوان یک مثال ساده، تعویض مقدار دو متغیر با یکدیگر را در نظر بگیرید. Snippet مربوط به این عمل می‌تواند چیزی مشابه تصویر زیر باشد. هنگام افزودن Snippet از برنامه نویس، جایگزین پارامترهای موجود در اسنیپت (که با $1 و $2 مشخص شده‌اند) پرسیده می‌شود.

اسنیپت Snippet
نمونه ای از یک Snippet فرضی برای تعویض مقدار دو متغیر

در ویژوال استادیو برای افزودن اسنیپت‌ها کافیست میانبر مربوط به آن را تایپ کرده و دو بار کلید Tab را فشار دهید. برای مثال هنگام برنامه نویسی به زبان C# در این IDE با نوشتن کلمه for و دو مرتبه فشار دادن Tab قطعه کد زیر نمایان می‌شود که برنامه نویس می‌تواند به راحتی متغیر شمارنده حلقه و … را با متغیر و مقادیر دلخواه خود جایگزین کند.

قطع کد حاصل از اسنیپت for
قطعه کدی که پس از افزودن Snippet حلقه for در ویژوال استادیو برای زبان سی شارپ ظاهر می‌شود.

گوگل اسنیپت

وازه Snippet در موتور جستجوی گوگل در واقع به همان توضیحات یا Description هایی گفته می‌شود که زیر عنوان هر نتیجه یافته شده در صفحات نتایج جستجو نمایش داده می‌شود؛ در برخی موارد نیز منظور از آن، کل یک نتیجه شامل عنوان، نشانی وب و توضیحات آن است. اما در هر حال ارتباطی با مفهوم این واژه در برنامه نویسی ندارد.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

حلقه Loop

حلقه یا Loop چیست؟

حلقه (Loop) در زبان های برنامه نویسی برای اجرای دنباله‌ای از دستورات به صورت تکراری مورد استفاده قرار می‌گیرد. بدنه حلقه (Loop Body) شامل دستوراتی است که قرار است تکرار شوند؛ این دستورات تنها یک بار نوشته می‌شوند اما ممکن است چندین بار به صورت پشت سرهم اجرا شوند. بخش دیگری از Loop که به آن هدر (header) نیز گفته می‌شود نوع Loop و ویژگی‌های آن را مشخص می‌کند.

انواع رایج حلقه ها

گونه‌های مختلفی از حلقه‌ها توسط اغلب زبان های برنامه نویسی امروزی پشتیبانی می‌شود. تعداد دفعاتی که دستورات موجود در یک لوپ اجرا می‌شود ممکن است به صورت مستقیم مشخص شود و یا به یک شرط یا تعداد عناصری که در یک مجموعه وجود دارد وابسته باشد. حتی ممکن است دستورات برای همیشه اجرا شوند و هیچ پایانی برای آن‌ها درنظر گرفته نشده باشد.

1- For Loop

حلقه‌های For از جمله رایج‌ترین حلقه‌هایی هستند که معمولا تعداد اجرای دستورات در آن‌ها به صورت مستقیم مشخص می‌شود. البته توجه داشته باشید این مفهوم بدان معنا نیست که تعداد دفعات اجرای دستورات می‌بایست به صورت ثابت هنگام برنامه نویسی مشخص شود بلکه به عنوان مثال تعداد تکرارها می‌تواند وابسته به مقدار یک متغیر باشد که هنگام اجرا از کاربر گرفته شده است و یا حاصل ارزیابی یک عبارت حسابی باشد.

در تصویر زیر می‌توانید دو نمونه For Loop را به زبان های جاوا (سمت چپ) و ویژوال بیسیک (سمت راست) مشاهده کنید. دستورات موجود در هر دو مثال 5 بار تکرار می‌شوند. متغیرهای index در این حلقه‌ها را متغیرهای شمارنده حلقه (Loop Counter) می‌نامند. در تکرار اول مقدار این متغیرها برابر با 1 می‌باشد (مقدار آغازین) و در هر تکرار یک واحد به آن‌ها افزوده می‌شود (گام شمارش در هر دو مثال برابر 1 است که در تصویر سمت چپ با i++ و در تصویر سمت راست به دلیل آنکه گام شمارش در زبان ویژوال بیسیک به صورت پیشفرض برابر با 1 است حذف شده است). در هر تکرار، مقدار کنونی متغیر شمارنده در خروجی نوشته می‌شود. زمانی که مقدار این متغیرها به 5 می‌رسد دستورات بدنه Loop برای آخرین بار اجرا می‌شوند. همانطور که مشاهده می‌کنید پایان لوپ در مثال سمت چپ با کمک شرط index <= 5 و در مثال سمت راست براساس مقداری که پس از کلمه To آمده است مشخص شده است. خروجی نهایی این دو مثال، اعداد 1 تا 5 خواهند بود.

حلقه For
نمونه‌هایی از حلقه‌های For به زبان‌های جاوا (سمت چپ) و ویژوال بیسیک (سمت راست)

2- While Loop

در حلقه‌هایی که توسط یک شرط کنترل می‌شوند معمولا دستورات تا زمانی که شرط صحیح باشد اجرا می‌شوند. بسته به نوع این حلقه‌ها، ممکن است شرط در ابتدا یا در انتهای حلقه بررسی شود؛ چنانکه شرط صحیح باشد برای بار دیگر دستورات حلقه تکرار می‌شوند. توجه داشته باشید در صورتی که این تست در انتهای ساختار Loop انجام شود حتی اگر شرط از همان ابتدا صحیح نباشد دستورات حداقل یک بار اجرا می‌شوند اما اگر شرط در همان ابتدای حلقه مورد بررسی قرار گیرد ممکن است دستورات بدنه هیچگاه اجرا نشوند.

حلقه‌های While (در اغلب زبان ها) و Do While و Do Until نمونه‌هایی از این نوع لوپ‌ها به شمار می‌روند با این تفاوت که در حلقه‌های While، شرط را تنها می‌توان در ابتدای حلقه بررسی نمود اما در حلقه‌های Do While و Do Until می‌توان شرط را در ابتدا یا انتهای حلقه بررسی کرد. به علاوه در حلقه‌های While و Do While تنها در صورتی که شرط صحیح باشد دستورات اجرا می‌شوند اما Do Until تا زمانی دستورات بدنه خود را اجرا می‌کند که شرط نادرست باشد و به محض صحیح بودن نتیجه تست شرط، حلقه متوقف می‌شود.

در تصویر زیر، از یک حلقه While برای ایجاد همان خروجی که در مثال قبل با استفاده از حلقه For به دست آمد استفاده شده است. در این نمونه شرط x <= 5 به عنوان شرط لوپ به کار رفته است و در بدنه هر تکرار یک واحد به متغیر x افزوده می‌شود (این درحالیست که در ساختار For این متغیر در هدر حلقه تغییر می‌کرد نه در بدنه آن).

حلقه While
نمونه‌ای از حلقه While به زبان جاوا

3- For each Loop

در بسیاری از زبان‌های برنامه نویسی افزون بر این حلقه‌ها از ساختارهای تکرارشونده ویژه‌ای برای مجموعه (Collection) ها پشتیبانی می‌شود. در این نوع حلقه‌ها که معمولا به حلقه‌های For each موسوم هستند دستورات برای هر عنصر از مجموعه مورد نظر تکرار می‌شود. در تصویر زیر نمونه حلقه For each را به زبان جاوا برای ایجاد خروجی مشابه با مثال‌های قبل مشاهده می‌کنید.

حلقه For each
نمونه‌ای از حلقه For each به زبان جاوا

4- Infinite Loop

حلقه های بی پایان یا نامحدود (Infinite Loop) نیز به حلقه‌هایی گفته می‌شود که دستورات بدنه آن‌ها تا زمان اجرای برنامه تکرار می‌شوند. این نوع از loop ها ممکن است به خاطر استفاده از شرایطی که هیچ پایانی برای تکرارها رقم نمی‌زنند به وجود بیاید (برای مثال یک While Loop که شرط آن true باشد). نمونه‌ای از کاربرد عمدی این نوع حلقه‌ها را می‌توان در مواردی دانست که لازم است برنامه به صورت مدوام وقوع رخدادی را چک کند.

ادامه حلقه و خروج زودهنگام از آن

در برخی موارد ترجیح داده می‌شود مابقی دستورات برای تکرار کنونی Loop نادیده گرفته شود و دنباله دستورات برای تکرار بعدی اجرا شوند. دستوراتی مانند continue (در اغلب زبان‌ها) و next (در زبان Perl) به همین منظور استفاده می‌شوند.

در برخی موارد نیز ممکن است موقعیتی پیش بیاید که لازم شود پیش از آنکه Loop به صورت طبیعی اتمام شود اجرای تکرارهای بعدی نادیده گرفته شود و حلقه به صورت پیش از موعد پایان یابد. به عنوان مثال هنگام جستجو در میان مجموعه‌ای از عناصر به محض اینکه عنصر موردنظر پیدا می‌شود اساسا نیازی به تکمیل فرایند جستجو در میان عناصر باقی‌مانده وجود ندارد. دستوراتی مانند break (در اغلب زبان‌ها)، last (در زبان Perl) و Exit (در زبان ویژوال بیسیک) به این منظور استفاده می‌شوند.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

عملگر بیتی Bitwise Operator

عملگر بیتی یا Bitwise Operator چیست؟

عملگر بیتی (Bitwise Operator) به عملگرهایی گفته می‌شود که عملی را روی یک یا چند عدد باینری در سطح بیت هایشان انجام می‌دهند. این اعمال را عملیات بیتی (Bitwise Operation) می‌نامند و از آنجایی که بسیار ساده هستند توسط پردازنده به صورت مستقیم نیز پشتیبانی می‌شوند. عملیات بیتی معمولا برای انجام اعمالی نظیر مقایسه، محاسبه و … مورد استفاده قرار می‌گیرد.

عملگرهای بیتی متداول

عملگرهای بیتی رایجی که در اغلب زبان های برنامه نویسی (و نه تمامی آن‌ها) پشتیبانی می‌شود شامل عملگرهای NOT (نقیض یا نفی)، AND (و)، OR (یا) و XOR (یای مانعه الجمع، یای انحصاری) بیتی و همچنین تعدادی از شیفت‌های بیتی پرکاربرد می‌باشد.

عملگر NOT بیتی، نوعی عملگر بیتی یکانی (تک عملوندی) است که تمام بیت‌های عملوند خود را تغییر می‌دهد. به عبارت بهتر، این عملگر، عمل نفی منطقی را روی تک تک بیت‌های عملوند انجام می‌دهد (بیت‌هایی که صفر هستند را به یک و بیت‌هایی که یک هستند را به صفر تبدیل می‌کند). یکی از کاربردهای این عملگر، محاسبه مکمل یک (1’s Complement) اعداد باینری می‌باشد.

عملگرهای AND و OR و XOR، عملگرهای باینری (دوتایی یا دو عملوندی) هستند. عملوندهایی که توسط این عملگرها بر روی آن‌ها عملیات بیتی انجام می‌شود می‌بایست دارای طول (تعداد بیت) یکسان باشند چرا که این اعمال روی بیت‌های متناظر عملوندها انجام می‌شود. توجه داشته باشید در فرم متدول نمایش باینری، سمت چپ‌ترین موقعیت بیتی را با ارزش ترین (یا مهم‌ترین) بیت (Most significant bit یا MSB) و سمت راست‌ترین موقعیت بیتی را کم ارزش ترین (یا کم اهمیت ترین) بیت (Least significant bit یا LSB) می‌نامند.

عملگر AND بیتی، عمل AND (و) منطقی را روی هر جفت از بیت‌های متناظر در عملوندهایش انجام می‌دهد. در صورتی که هر دو بیت در موقعیت‌های متناظر از دو عملوند برابر با یک باشند بیت متناظر در حاصل عملگر نیز برابر با یک و در غیراینصورت برابر با صفر خواهد بود.

عملگر OR بیتی عملگری است که عمل OR (یا) منطقی را روی هر جفت از بیت‌های متناظر در عملوندهایش انجام می‌دهد. اگر دو بیت در موقعیت‌های متناظر از دو عملوند برابر با صفر باشند بیت متناظر در حاصل عملگر نیز برابر با صفر و در غیراینصورت برابر با یک خواهد بود.

عملگر XOR بیتی نیز عمل یای مانعه الجمع (یای انحصاری) منطقی را روی هر جفت از بیت‌های متناظر در عملوندهایش انجام می‌دهد. به این معنا که اگر هر دو بیت در موقعیت‌های متناظر از دو عملوند برابر با صفر یا هر دو برابر با یک باشند بیت متناظر در حاصل عملگر برابر با صفر و در غیراینصورت (یکی صفر و دیگری یک باشد) برابر با یک خواهد بود.

عملگر بیتی Bitwise Operator
نمونه‌ای از انجام چهار عملیات بیتی. در این تصویر، حاصل عملگرهای بیتی NOT و AND و OR و XOR را روی عملوندهای مشخص شده مشاهده می‌کنید.

عملگرهای شیفت بیتی، ارقام عملوند خود را براساس نوع شیفت، به سمت چپ یا راست جابجا می‌کنند. از آنجایی که ثبات‌ها در پردازنده دارای طول ثابتی هستند بنابراین در هر عمل شیفت، بیت‌هایی از یک سمت حذف (یا خارج) می‌شوند (Shift out) و بیت‌هایی نیز از سمت دیگر برای تکمیل موقعیت آزاد شده وارد می‌شوند (Shift in). به عنوان مثال در شیفت تک بیتی به سمت راست، سمت چپ‌ترین موقعیت بیتی آزاد می‌شود و لازم است یک بیت دیگر در این مکان قرار داده شود. تفاوت انواع مختلف عملگرهای شیفت بیتی در نحوه تعیین مقدار بیتی است که می‌بایست در موقعیت آزاد شده قرار گیرد.

عملگر بیتی شیفت Bit Shift
مقایسه انواع شیفت بیتی روی عدد باینری 00010111 – شیفت‌ها نوعی عملگر بیتی به شمار می‌روند که ارقام عملوند خود را براساس نوع شیفت، به سمت چپ یا راست جابجا می‌کنند.

در شیفت حسابی (Arithmetic Shift) به سمت چپ، بیت‌های صفر از سمت راست به منظور تکمیل موقعیت آزاد شده وارد می‌شوند. اما در شیفت حسابی به سمت راست مقدار باارزش‌ترین بیت، موقعیت آزاد را از سمت چپ تکمیل می‌کند. با توجه به اینکه در اعداد باینری علامت‌دار، با ارزش‌ترین بیت، تعیین‌کننده علامت عدد می‌باشد بنابراین شیفت حسابی به سمت راست، علامت عدد را تغییر نمی‌دهد.

در شیفت منطقی (Logical Shift) برخلاف شیفت حسابی همواره بیت‌های صفر جایگزین موقعیت‌های آزاد شده می‌شود. از اینرو شیفت منطقی و حسابی به سمت چپ هردو نتیجه‌ای یکسان خواهند داشت. یکی دیگر از انواع مهم شیفت، شیفت دایره ای (Circular Shift) نام دارد که در آن مقدار همان بیتی که هنگام شیفت به راست یا چپ خارج شده است از سمت دیگر وارد می‌شود به گونه‌ای که می‌توانید تصور کنید دو سر رشته بیتی همانند یک دایره به یکدیگر متصل شده است.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

تجربه کاربری User Experience – UX

تجربه کاربری یا User Experience چیست؟

تجربه کاربری (User Experience به اختصار UX یا UE) در حوزه رایانه، به تجربه و احساس یک کاربر در قبال استفاده از یک محصول، سیستم یا سرویس رایانه‌ای گفته می‌شود. این تجربه وجوه مختلفی نظیر مفید بودن محصول، قابل استفاده بودن، نحوه تعامل با محصول و شرکت، کارآمدی و … را شامل می‌شود. منظور از محصول در این مفهوم می‌تواند هرچیزی از جمله یک وبسایت، یک اپلیکیشن و یا یک سرویس تحت وب باشد. البته گفتنی است اصطلاح تجربه کاربری تنها به محصولات و خدمات مرتبط با دنیای دیجیتال محدود نمی‌شود.

در بسیاری از موارد می‌توان رابطه‌ای مستقیم و تنگاتنگ میان قابل استفاده بودن (Usability) و تجربه کاربری قائل شد تا حدی که در برخی متون از این دو واژه به جای یکدیگر استفاده می‌شود. این در حالیست که مفهوم قابل استفاده بودن تنها روی بخش‌هایی که یک کار انجام می‌شود تأکید دارد و تجربه کاربری علاوه بر این به احساسات کاربر نسبت به انجام کار و خوشایندی یا لذتی که در تعامل با سیستم به او دست می‌دهد نیز وابسته می‌باشد. در واقع تجربه کاربری به طور عمومی احساس کاربر از کار با سیستم را مورد بررسی قرار می‌دهد و تمامی جنبه‌های تعامل او با یک شرکت، محصولات و خدمات آن را در برمی‌گیرد. در عمل می‌توان گفت این تجربه، تحت تأثیر عوامل خارجی نظیر برند، قیمت، نظر و بازخورد دوستان و کاربران دیگر نیز قرار می‌گیرد.

طراحی تجربه کاربری

بهبود تجربه کاربری و افزایش رضایت کاربر از محصول و سیستمی که با آن در ارتباط است طی فرایندی تخصصی تحقق می‌یابد که با عنوان طراحی تجربه کاربری (User Experience Design یا به اختصار UX Design) شناخته می‌شود. فرایندی که شامل اجزای مختلفی از طراحی واسط کاربری گرفته تا معماری اطلاعات (سازماندهی، قابل جستجو و مدیریت بودن)، طراحی تعاملات میان کاربر و سیستم، خوشایندی، قابل استفاده بودن (استفاده کارامد و آسان، یادگیری بدون دشواری)، دسترس پذیری (دسترسی، درک و استفاده آسان حتی برای افراد ناتوان) و … می‌باشد. فرایندی که تحقق کامل آن علاوه بر دانش رایانه نیازمند علوم دیگری از جمله روان‌شناسی، تجارت و شناخت بازار، طراحی گرافیکی و جامعه‌شناسی نیز خواهد بود.

به عنوان مثال برای طراحی UX مناسب در حوزه وب، رعایت نکات زیر توسط کارشناسان توصیه می‌شود:

  • ارائه محتوای مناسب و کاربردی (متون جذاب و خوانا، محتوای مفید و قابل اعتماد، پرهیز از گزافه‌گویی)
  • رعایت اصول طراحی بصری (استفاده به جا و مناسب از المان‌های مختلف تصویری و رنگ‌ها، استفاده از فونت‌های شکیل و خوانا و …)
  • قرار دادن عناوین مناسب در مکان‌های مناسب
  • هدایت کاربر از صفحه‌ای به صفحه دیگر با پیش‌بینی صحیح نیازها و خواسته‌های او
  • واسط کاربری ساده و در عین حال کاربردی
  • جلوگیری از به وجود آمدن پیوندهای مرده
  • بارگیری سریع وبسایت (پیشنهاد می‌شود ابتدا متون صفحه بارگیری شود و از تکنیک‌های Lazy Loading برای نمایش تصاویر به محض قرار گرفتن در محدوده دید کاربر استفاده شود)
  • پرهیز از درج تبلیغات آزاردهنده و استفاده نامناسب از پاپ آپ
  • طراحی واکنشگرای وبسایت (به گونه‌ای که برای کاربران رایانه‌ها و گوشی‌های هوشمند، متناسب با اندازه صفحه نمایش، جلوه مناسب و کارآمدی داشته باشد)
  • امکان دسترسی آسان به بخش‌های مختلف سایت، جستجو و یافتن بدون دردسر و سریع محتوایی که مدنظر کاربر است.
  • و …

عدم توجه به این نکات چه در حوزه طراحی بصری و چه در حوزه محتوا و عملکرد می‌تواند به وازدگی کاربر از وبسایت شما منجر شود و این به معنای از دست رفتن آسان مخاطب یا مشتری  شما خواهد بود.

تجربه کاربری User Experience
فاکتورهای موثر در طراحی تجربه کاربری از دید برخی کارشناسان این حوزه

در نهایت می‌توان گفت شناخت کاربر و دانستن اینکه چه چیزی می‌خواهد، برای چه چیزی ارزش قائل می‌شود، چه محدودیت‌ها و چه توانایی‌هایی دارد و همچنین توجه به بازخوردهای دریافتی از سوی کاربران می‌تواند در خلق و بهبود یک تجربه کاربری مناسب، نقش مهمی ایفا کند. با توجه به اهمیت کاربر در دنیای دیجیتال امروزی، نیاز به طراحی تجربه کاربری شایسته و استفاده از طراحان حرفه‌ای در این حوزه از اهمیت ویژه‌ای برخوردار است و می‌تواند عاملی تعیین کننده برای موفقیت یا شکست یک محصول به شمار رود.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

ساختمان داده Data Structure

ساختمان داده یا Data Structure چیست؟

ساختمان داده (Data Structure) فرمت یا قالبی است برای سازماندهی، مدیریت و نگه داری داده ها به طوری که انجام اعمال معینی روی این داده ها را به شکلی کارآمد میسر می‌سازد.

برای اینکه مفهوم ساختمان داده را بهتر متوجه شوید تصور کنید هر صبح که از خواب بیدار می‌شوید مجبورید برای آماده شدن و رفتن به محل کار، دنبال جوراب‌های عزیزتان بگردید! اگر خانه شما نظم و ترتیبی نداشته باشد طبیعتا کارتان خیلی دشوار خواهد بود. احتمالا برای پیدا کردن جوراب‌هایتان باید تمام کمد لباس‌ها، جالباسی، داخل کفش‌ها، زیر تخت و اگر از این هم حواستان پرت‌تر باشد داخل قفسه‌های کتابخانه و یخچال را هم جستجو کنید! اما اگر در خانه شما همه چیز مرتب و درست در قسمت مخصوص به خودش قرار داشته باشد پیدا کردن جوراب‌ها برایتان دشواری چندانی نخواهد داشت. ساختمان داده هم در مقایسه با یک خانه مرتب، نقش مشابهی برای داده‌های شما ایفا می‌کند.

به عبارت بهتر، یک Data Structure می‌تواند مجموعه‌ای از داده‌ها، روابط میان آن‌ها و اعمالی باشد که روی این داده‌ها قرار است انجام شود. در مثال بالا عملی که مورد نظر شما بود پیدا کردن (یا جستجوی) جوراب بود. از جمله مهم‌ترین اعمالی که در مورد ساختمان داده‌ها زیر ذره‌بین قرار می‌گیرد می‌توان به مواردی از جمله دسترسی به داده ها، افزودن داده جدید و حذف یک داده مشخص و همچنین جستجو و مرتب سازی داده ها و … اشاره نمود. البته الزاما هر ساختمان داده‌ای قادر به انجام کارامد تمامی این اعمال نمی‌باشد. به همین دلیل امروزه برای کاربردهای مختلف از ساختمان داده‌های مختلفی استفاده می‌شود.

نمونه‌هایی از ساختمان داده های رایج

اغلب زبان‌های برنامه نویسی سطح بالا از ساختارها و قواعد مشخصی برای ساختمان داده های ویژه پشتیبانی می‌کنند. آرایه (Array) یکی از رایج‌ترین و پرکاربردترین ساختمان داده‌ها به شمار می‌رود که مجموعه‌ای از داده‌ها را در خود نگه داری می‌کند و با کمک اندیس‌هایی که به هرکدام از این داده ها اختصاص می‌دهد امکان دسترسی و تغییر آن‌ها را فراهم می‌کند.

آرایه Array
تجسم تصویری یک آرایه با 5 عنصر عددی – آرایه یکی از پرکاربردترین ساختمان داده هاست.

پشته (Stack) نیز یکی دیگر از ساختمان داده های پرکاربرد است. داده ها در این ساختمان داده به شکل پشته‌ای از عناصر روی یکدیگر سوار می‌شوند و جدیدترین عنصری که در آن ذخیره شده است اولین عنصری خواهد بود که پردازش (یا حذف) می‌شود. از دیگر Data Structure های رایج می‌توان به صف (یا Queue)، لیست پیوندی (یا Linked List)، درخت جستجوی دودویی (یا Binary Search Tree)، جدول درهم سازی (یا Hash Table) و هرم (یا Heap) اشاره نمود.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

همتا به همتا Peer to Peer – P2P

همتا به همتا یا Peer to Peer چیست؟

همتا به همتا (Peer to Peer یا به اختصار P2P) یک مدل ارتباطی نامتمرکز و گونه‌ای از معماری‌های توزیع شده است که در آن اعمال و بار محاسباتی روی گره های مشابهی به نام همتا (Peer) توزیع می‌شود. همتاها در این نوع شبکه ها دارای مجوزها و نقش‌های مشابهی هستند.

گره ها در یک شبکه P2P علاوه بر اینکه از دیگر گره ها خدمات و منابع دریافت می‌کنند بخشی از منابع خود (نظیر قدرت پردازشی، فضای ذخیره سازی، پهنای باند و …) را نیز در اختیار سایر گره های شبکه قرار می‌دهند. این مدل در نقطه مقابل مدل کلاینت – سرور قرار می‌گیرد. در واقع در شبکه P2P، هر همتا هر دو نقش کلاینت (مصرف کننده منابع) و سرور (یا فراهم کننده منابع) را ایفا می‌کند، این در حالیست که در مدل کلاینت – سرور این دو نقش کاملا از یکدیگر مجزا هستند.

هرچند کاربرد شبکه های P2P به زمان‌های پیش‌تر باز می‌گردد اما فراگیری و محبوبیت آن را باید مدیون سامانه‌های اشتراک فایل (به ویژه اپلیکیشن اشتراک موسیقی Napster – تأسیس در سال 1999) دانست.

کاربران برای اتصال به شبکه های P2P گسترده، معمولا نیازمند یک ارتباط اینترنتی و یک اپلیکیشن مخصوص هستند. این اپلیکیشن ها عملکرد گره به عنوان کلاینت و سرور را مدیریت می‌کنند و ممکن است به کاربر اجازه دهند پارامترهای مختلف از قبیل میزان منابعی که قرار است به شبکه تخصیص داده شود و تعداد ارتباط‌های مجاز که با سایر گره ها برقرار می‌کند را مشخص نمایند.

ویژگی ها، مزایا و معایب

به طور کلی در یک شبکه همتا به همتا هرچه تعداد کاربران افزایش پیدا کند ظرفیت شبکه نیز افزایش می‌یابد. اگر یک گره در شبکه به درستی کار نکند در صورتی که به اندازه کافی شبکه گسترده باشد سایر همتاها آن را جبران کرده و در نتیجه شبکه دچار اختلال نمی‌شود. این در حالیست که در مدل کلاینت – سرور، منابع سرور (یا سرورها) روی کلاینت‌ها تقسیم می‌شود و در صورت افزایش تعداد درخواست‌ها ممکن است سرور نتواند به شکل مناسب آن‌ها را پاسخ بدهد. علاوه بر این احتمال بروز شکست در چنین شبکه هایی نیز بیشتر خواهد بود چرا که در این مدل، تعداد گره‌هایی که مسئولیت سرویس دهی را بر عهده دارند محدود است.

استفاده از مدل همتا به همتا در مقایسه با مدل کلاینت – سرور مزایا و معایب دیگری هم دارد. به عنوان مثال در مورد اشتراک گذاری فایل، اگر فایل‌ها روی یک سرور نگه‌داری شود این مدیران سرور هستند که در هر لحظه می‌توانند به دلایلی (از جمله فشار دولت یا نقض حقوق کپی رایت) فایلی را از دسترس کلاینت‌های خود خارج کنند. از سوی دیگر، کلاینت‌ها معمولا به شکلی مطمئن می‌توانند به فایل موردنظر خود دسترسی داشته باشند حتی اگر فایل، مربوط به یک موسیقی یا نرم‌افزار نه چندان مشهور باشد که روی فضای سرور ذخیره شده است. این در حالیست که در مدل همتا به همتا، دسترسی به فایل‌هایی که چندان شناخته شده نیستند معمولا کار آسانی نیست. چرا که در مدل P2P باید حداقل یک گره، فایل مورد نظر را در اختیار داشته باشد، آن را به اشتراک گذاشته باشد و از سوی دیگر گره درخواست دهنده بتواند به گره دارای این فایل متصل شود. البته باید در نظر داشت که پایداری و دسترس پذیری شبکه‌های P2P برای اشتراک فایل‌های محبوب بسیار بالاتر خواهد بود.

سامانه های انتقال محتوا و اشتراک فایل که براساس این مدل فعالیت می‌کنند نه تنها همراه با افزایش تعداد کاربران، ظرفیت سرویس‌دهی‌شان افزایش پیدا می‌کند بلکه هزینه‌های آن‌ها در برابر سامانه‌های مشابه مبتی بر مدل کلاینت – سرور بسیار کمتر خواهد بود. این سامانه‌ها با توجه به عدم وجود سرور مرکزی معمولا به راحتی می‌توانند حق کپی رایت فایل‌های چندرسانه‌ای و نرم‌افزارها را نقض کنند. BitTorrent از جمله مشهورترین پروتکل های ارتباطی برای اشتراک فایل همتا به همتا می‌باشد.

دسترسی گمنام به محتوا، ایجاد محیط‌های محاسبات موازی و پیچیده و ارزهای رمزنگاری شده دیجیتال نظیر بیت کوین از جمله دیگر کاربردهای شبکه های P2P به شمار می‌رود. از آنجایی که نرم‌افزارهای P2P به عنوان سرور و کلاینت عمل می‌کنند معمولا از نظر امنیتی می‌توانند آسیب‌پذیرتر باشند.

همتا به همتا و کلاینت - سرور Peer to Peer and Client - Server
مقایسه مفهومی مدل های همتا به همتا و کلاینت – سرور. در مدل P2P (سمت چپ) تمام گره‌ها هم نقش کلاینت را ایفا می‌کنند و هم منابع خود را در قالب یک سرور به اشتراک می‌گذارند. در حالی که در مدل کلاینت – سرور (سمت راست) کلاینت‌ها خدمات و منابع موردنیاز خود را از یک سرور مرکزی درخواست می‌کنند.

از ترکیب مدل همتا به همتا و کلاینت – سرور، مدل‌های هیبریدی شکل می‌گیرند. در یک مدل هیبریدی متداول از یک سرور مرکزی برای کمک به همتاها جهت یافتن یکدیگر، جستجوی نام فایل‌هایی که توسط همتاها به اشتراک گذاشته شده و … استفاده می‌شود.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

واحد محاسبه و منطق Arithmetic Logic Unit – ALU

واحد محاسبه و منطق یا Arithmetic Logic Unit چیست؟

واحد محاسبه و منطق (Arithmetic Logic Unit به اختصار ALU) یک مدار الکترونیک دیجیتال ترکیبی است که قادر به انجام اعمال منطقی و حسابی روی اعداد صحیح باینری می‌باشد. این واحد به عنوان یکی از اجزای اساسی در بسیاری از مدارات رایانه ای (از جمله واحد پردازش مرکزی یا CPU و واحد پردازش گرافیکی یا GPU) به شمار می‌رود.

ساختار واحد محاسبه و منطق

همانطور که گفته شد واحد محاسبه و منطق نوعی مدار ترکیبی به شمار می‌رود به این معنا که خروجی آن صرفا وابسته به ورودی مدار در همان زمان است. ورودی‌های واحد محاسبه و منطق عبارتند از عملوندها (که قرار است عمل منطقی یا حسابی روی آن‌ها انجام شود) و همچنین کدی (Opcode) که نوع عمل را مشخص می‌کند. حاصل این واحد نیز نتیجه انجام عمل مشخص شده روی عملوندهاست. ممکن است ALU ها دارای ورودی‌ها و خروجی‌های وضعیت (Status) نیز باشند که به ترتیب حاوی اطلاعاتی راجع به عمل پیشین و کنونی خواهند بود.

عملوندها و حاصل که در تصویر زیر به ترتیب با A و B و Y نمایش داده شده‌اند در واقع هرکدام مجموعه‌ای از سیگنال ها هستند که یک عدد صحیح را در فرم باینری نشان می‌دهند. طبیعتا تعداد ارقام این اعداد (پهنای گذرگاه آن‌ها) متناسب با مدارهای خارجی هستند که برای ALU این ورودی‌ها را ارسال و از خروجی آن استفاده می‌کنند.

واحد محاسبه و منطق Arithmetic Logic Unit - ALU
نمایی ساده از وروی‌ها و خروجی‌ها در یک ALU

بسته به پهنای گذرگاه مربوط به Opcode، بیشینه تعداد اعمالی که ALU قادر به انجام آنست مشخص می‌شود. برای مثال واحد محاسبه و منطقی با گذرگاه Opcode چهار بیتی می‌تواند حداکثر از 16 (دو به توان 4) عمل مختلف پشتیبانی کند.

مهم‌ترین خروجی‌های وضعیت در ALU ها، رقم نقلی (که در عمل جمع رخ می‌دهد)، رقم قرضی (که در عمل تفریق رخ می‌دهد) و بیت سرریز (یا Overflow که در اثر عمل شیفت باینری رخ می‌دهد) می‌باشد. ورودی‌های وضعیت در یک ALU که اطلاعات بیشتری برای انجام عمل در اختیار این واحد قرار می‌دهند در واقع همان خروجی‌های وضعیتی هستند که از انجام عملی در ALU پیشین به دست آمده است.

مدار منطقی یک ALU ساده
مدار منطقی 74181 – یک ALU ساده چهار بیتی

از جمله اعمال اصلی که در اغلب واحدهای محاسبه و منطق امروزی پشتیبانی می‌شود می‌توان به اعمال حسابی (از جمله عمل جمع، جمع با رقم نقلی، تفریق، تفریق با رقم قرضی، محاسبه مکمل دوم یک عملوند، افزایش و کاهش یک واحدی یکی از عملوندها)، اعمال منطقی بیتی (از جمله محاسبه AND و OR و XOR میان عملوندها و محاسبه مکمل اول یک عملوند) و اعمال شیفت بیتی (که در آن یک عملوند به سمت چپ یا راست شیفت داده می‌شود و شامل شیفت منطقی، شیفت حسابی و چرخش می‌باشد) اشاره نمود.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

اسپاگتی کد Spaghetti Code

اسپاگتی کد یا Spaghetti Code چیست؟

اسپاگتی کد (Spaghetti Code) یا کد درهم تنیده اصطلاحی در حوزه برنامه نویسی رایانه ای است و به سورس کدهایی گفته می‌شود که فاقد ساختار مناسب بوده و به علت پیچیدگی غیرضروری، فهم و نگه داری آن به امری دشوار تبدیل می‌شود. این درهم تنیدگی و پیچیدگی می‌تواند ناشی از عوامل مختلفی از جمله نبود قوانین مناسب برای استایل‌های برنامه نویسی و تجربه یا دانش ناکافی فرد برنامه نویس باشد.

استفاده از دستورات GOTO به عنوان روشی برای جهش (که زبان های برنامه نویسی قدیمی وابستگی بیشتری به آن داشتند و در بسیاری از زبان های امروزی نیز از آن پشتیبانی می‌شود) یکی از شایع ترین دلایل ایجاد کدهای درهم پیچیده و دارای جریان کنترلی (Control Flow) آشفته به شمار می‌رود. به این معنا که ترتیب اجرای دستورات در این سورس کدها برخلاف برنامه نویسی ساخت یافته استاندارد به شکلی واضح و قابل فهم نمی‌باشد و همانند یک بشقاب اسپاگتی دارای رشته‌هایی است که از ابتدا تا انتها با پیچ و خم‌های فراوان همراه می‌شود. طبیعتا دستکاری و تغییر قطعه‌ای از این کدها به گونه‌ای که باعث بروز مشکل در سایر بخش‌های آن نشود کار ساده‌ای نخواهد بود؛ درست مانند جدا کردن یک قاشق از اسپاگتی که معمولا باعث می‌شود رشته‌های دیگری که در بشقاب قرار دارد نیز قطع شوند!

با وجود اینکه امروزه دستور GOTO در سورس کدها کمتر دیده می‌شود و حتی برخی از زبان‌های برنامه نویسی از آن پشتیبانی نمی‌کنند اما همچنان وجود توابع طولانی، انشعابات متعدد و قطعه کدهای نوشته شده با ساختار ضعیف از جمله مواردی به شمار می‌روند که منجربه ایجاد اسپاگتی کد می‌شود. بد نیست بدانید تغییر نامناسب و مکرر سورس کدهایی که سال‌ها پیش نوشته شده‌اند نیز می‌تواند به شکل‌گیری چنین کدهایی بیانجامد.

اسپاگتی کد Spaghetti Code
نمایی مفهومی از روند اجرای دستورات در یک قطعه کد اسپاگتی مملو از جهش همانند رشته‌های موجود در یک بشقاب اسپاگتی!

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

جدول درهم سازی Hash Table

جدول درهم سازی یا Hash Table چیست؟

جدول درهم سازی (Hash Table) نوعی ساختمان داده است که قادر به نگه داری جفت داده‌هایی به صورت کلید و مقدار (Key, Value) می‌باشد. هر کلید در این ساختمان داده مشابه یک فرهنگ لغت به مقدار متناظر خود نگاشت می‌شود.

تمامی این جفت داده‌ها در مجموعه‌ای از حفره (Slot) ها یا جام (Bucket) ها با اندیس‌های متمایز نگه داری می‌شوند. ایده پشت پرده این نوع ساختمان داده جستجو و یافتن سریع اندیسی از این مجموعه است که مقدار متناظر با یک کلید مشخص در آن نگه داری می‌شود. اعمال اصلی که روی یک جدول درهم سازی قابل انجام است عبارتند از:

  • جستجوی مقدار مربوط به یک کلید
  • افزودن یک جفت کلید و مقدار
  • حذف یک جفت کلید و مقدار

درهم سازی و تابع درهم ساز

در جداول درهم سازی، به عمل نگاشت مجموعه‌ای از کلیدها به اندیس‌های یک لیست یا آرایه، هش کردن یا درهم سازی (Hashing) گفته می‌شود. در این ساختمان داده از تابعی به نام تابع درهم ساز (Hash Function) برای محاسبه این اندیس استفاده می‌شود. به عبارت بهتر تابع درهم ساز برای هر کلید (که به عنوان ورودی دریافت می‌کند) یک عدد صحیح یا اندیس (به عنوان خروجی) برمی‌گرداند. حفره متناظر با این اندیس در صورت خالی بودن برای قرار گرفتن مقدار مربوط به آن کلید مورد استفاده قرار می‌گیرد. توجه داشته باشید که کلیدها در یک جدول درهم سازی باید از یکدیگر متمایز باشند.

به عنوان مثال فرض کنید جفت‌های (Key, Value) به صورت (1, 5)، (3, 7)، (7, 4)، (12, 7) و (14, 8) قرار است در یک جدول درهم سازی که با کمک آرایه معمولی پیاده سازی شده و دارای ظرفیت 10 آیتم (با اندیس های 0 تا 9) است نگه داری شود. تابع درهم ساز را به صورت Key % 10 (یعنی باقیمانده مقدار کلید در تقسیم بر عدد 10) تعریف می‌کنیم. روشن است که مقدار حاصل از این تابع تنها می‌تواند یکی از اعداد مابین 0 تا 9 باشد. نتیجه حاصل از تابع درهم ساز برای پنج کلید 1، 3، 7، 12 و 14 همراه با جدول درهم سازی نهایی را می‌توانید در تصویر زیر مشاهده کنید. در آرایه حاصل (جدول درهم سازی)، جفت کلید و مقدار هر دو ذخیره شده‌اند که البته در این مثال ساده می‌توان تنها به ذخیره مقدارها اکتفا نمود:

جدول درهم سازی Hash Table
نمونه‌ای از روند ایجاد یک جدول درهم سازی – این جدول با کمک یک آرایه معمولی دو بعدی پیاده سازی شده است.

به منظور جستجو، روندی کاملا مشابه طی می‌شود. فرض کنید می‌خواهیم مقدار متناظر با کلید 12 را در جدول فوق بیابیم. این کلید را به تابع درهم ساز می‌دهیم و تابع، اندیس شماره 2 را برمی‌گرداند. به این ترتیب مقدار درج شده در حفره دوم جدول یعنی 7 به آسانی و بدون نیاز به بررسی سایر حفره‌ها یافت می‌شود.

در حالت ایده آل انتظار داریم تابع درهم ساز، هر کلید را به یک حفره منحصربفرد و متفاوت نگاشت کند. چنین تابعی را تابع درهم ساز پرفکت یا کامل (Perfect Hash Function) می‌نامند. حال تصور کنید بخواهیم جفت جدید (22, 12) را به جدول درهم سازی فوق اضافه کنیم. با توجه به اینکه باقی مانده 22 بر عدد 10 برابر با 2 می‌شود بنابراین اندیس 2 توسط تابع درهم ساز برای قرار گرفتن جفت جدید انتخاب می‌شود. این در حالیست که حفره مربوط به این اندیس در آرایه اشغال می‌باشد. به این پدیده، برخورد (یا Collision) گفته می‌شود که در آن اندیسی یکسان برای دو یا چند کلید متفاوت تولید می‌شود. در چنین مواردی لازم است با کمک روش‌های مختلف، اندیس مناسبی برای قرارگیری مقدار مربوط به کلید یا کلیدهای دیگر درنظر گرفته شود.

یکی از مشخصه‌های مهم جدول‌های درهم سازی، فاکتور لود (Load Factor) نام دارد که به صورت “تعداد جفت‌هایی که قرار است در جدول ذخیره شود تقسیم بر تعداد حفره‌ها” محاسبه می‌شود. هرچه این مقدار بزرگتر باشد کارایی جدول درهم سازی پایین‌تر می‌آید. البته زمانی که فاکتور لود به سمت صفر میل می‌کند نیز با اتلاف حافظه روبرو می‌شویم چرا که در این حالت تعداد حفره‌ها به مراتب بیشتر از تعداد جفت کلید و مقدار خواهد بود. یک تابع درهم ساز پرفکت که مقادیر حاصل از آن برای n کلید به صورت n عدد صحیح پشت سرهم (معمولا 0 تا n-1) باشد را تابع پرفکت مینیمال می‌نامند چرا که در این حالت هیچ اتلاف حافظه‌ای نخواهیم داشت.

از جمله کاربردهای رایج جداول درهم سازی در ایجاد آرایه های انجمنی و ایندکس کردن پایگاه داده ها می‌باشد.

برطرف نمودن برخورد

معمولا بروز برخورد در مواقعی که تعداد زیادی جفت کلید/مقدار در اختیار داریم حتی با استفاده از بهترین توابع درهم ساز نیز غیرقابل اجتناب است. بنابراین وجود یک استراتژی مناسب برای برطرف نمودن برخوردها ضروری می‌باشد. آدرس دهی باز (Open Addressing) یکی از رایج‌ترین این استراتژی‌هاست. در این روش اگر اندیسی از آرایه که برای قرارگیری موجودیت جدید انتخاب شده اشغال باشد با استفاده از یک روش کاوش، به دنبال حفره دیگری می‌گردیم که خالی باشد. برای مثال در مدل کاوش خطی (Linear Probing) اگر حفره‌ای پر باشد تک تک حفره‌های پس از آن را تا زمانی که مکان خالی پیدا شود کاوش می‌کنیم. درنتیجه برای افزودن جفت (22, 12) در جدول فوق ابتدا حفره 2 بررسی می‌شود. از آنجایی که این حفره اشغال است به سراغ حفره 3 می‌رویم. این کار به همین ترتیب ادامه می‌یابد تا نهایتا جفت (22, 12) در حفره 5 قرار می‌گیرد. هنگام جستجو برای یافتن مقدار متناظر با کلید 22 نیز ابتدا حفره 2 بررسی می‌شود و این بررسی تا رسیدن به حفره‌ای که کلید 22 در آن ذخیره شده است ادامه می‌یابد. گفتنی است طول گام‌ها در کاوش خطی می‌تواند مقدار ثابتی به جز یک هم داشته باشد. درهم سازی دوبل (Double Hashing) این طول گام را براساس یک تابع درهم ساز ثانویه محاسبه می‌کند.

زنجیره سازی مستقل (Separate Chaining) نمونه‌ای دیگر از استراتژی‌های رفع برخورد است که در آن هر حفره به یک لیست مجزا اشاره می‌کند. هر لیست تمامی جفت های کلید و مقداری که در اندیس مربوط به آن حفره دچار برخورد می‌شوند را در خود نگه داری می‌کند. برای پیاده سازی لیست‌ها معمولا از لیست‌های پیوندی استفاده می‌شود. در تصویر زیر نحوه ایجاد جدول درهم سازی با کمک این استراتژی و پس از افزودن جفت (22, 12) نمایش داده شده است. در این روش، هنگام جستجو برای مقدار متناظر با کلید 22 تنها کافی است لیست مربوط به حفره 2 مورد کاوش قرار گیرد.

زنجیره سازی مجزا در جدول درهم سازی
رفع برخورد در جدول درهم سازی با کمک زنجیره سازی – در این نمونه از لیست پیوندی استفاده شده است.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا