شرایط ورود به رشته کامپیوتر
سخت افزار کامپیوتر یا به انگلیسی Hardware، به اجزای فیزیکی تشکیل دهنده یک کامپیوتر گفته میشود. درواقع هر جزئی از کامپیوتر که شما بتوانید به آن دست بزنید، یک سخت افزار است که هرکدام ازآنها نقش مهمی در کارایی سیستم دارند. سیستمهای کامپیوتری را میتوان بر اساس نوع سختافزار آنها و ویژگیهایشان، مورد بررسی قرار داد. درادامه به انواع سخت افزار کامپیوتر و معرفی آنها نیز میپردازیم.
در صورتیکه به این مقاله علاقهمند هستید، ممکن است صفحات زیر نیز برای شما جذاب باشد:
- معرفی کامل و 0 تا 100 رشته کامپیوترمعرفی کامل رشته کامپیوتر- بررسی درآمد و شغل های رشته کامپیوتردر این صفحه به بررسی و موشکافی رشته کامپیوتر اعم از بررسی بازار کار، گرایشها، دروس و چارت درسی رشته کامپیوتر، میزان درآمد و حقوق فارغ التحصیلان این رشته و ادامه تحصیل در رشته کامپیوتر پرداخته شده است.
- رشته کامپیوتر برای دخترآیا رشته کامپیوتر برای دختران مناسبت است؟آمارها حاکی از آن است که زنان به سرعت در حال پیشرفت در علوم کامپیوتر و گرفتن شغلهای تخصصی و حساس هستند در نتیجه در این صفحه نقش خانمها را در رشته کامپیوتر بررسی و به طور کامل تحلیل کردهایم. مناسب است.
- بررسی درامد رشته کامپیوتربررسی درآمد رشته کامپیوتر در ایران و خارج از کشوردر این صفحه به بررسی درامد رشته کامپیوتر در ایران و همچنین درامد رشته کامپیوتر در خارج از کشور از جمله کانادا، آمریکا، انگلیس، فرانسه و دیگر کشورها پرداخته شده است در ایران و خارج از کشور
- بررسی شغل های رشته کامپیوترمعرفی و بررسی مشاغل رشته کامپیوتردر این صفحه تمامی شغلهای رشته کامپیوتر در ایران و خارج از کشور، شغلهای رشته کامپیوتر برای خانمها و شغلهای پردرآمد رشته کامپیوتر و بهترین مشاغل رشته کامپیوتر در سال 2022 بررسی شده است..
- معرفی کامل و 0 تا 100 رشته فناوری اطلاعاتمعرفی فناوری اطلاعات (IT) - 7 دلیل برای انتخاب رشته آی تی در دانشگاهآی تی چیست و چگونه پس از ظهور توانست در مدت فقط 20 سال تمام دنیا را فرا بگیرد و اکثر پول دنیا را ببلعد و پرطرفدارترین و پر درآمدترین مشاغل دنیا را در بر گیرد، با بررسی کامل آی تی با ما همراه باشید..
- پردازنده (CPU)پردازنده (CPU) چیست؟ بررسی انواع، وظایف و کاربردهاسی پی یو قلب کامپیوتر و کامپیوتر قلب دنیای کنونی است، بنابراین در این صفحه به معرفی و بررسی سیپییو یا همان پردازنده مرکزی (CPU) پرداخته شده، و بطور کامل توضیح دادهایم که CPU از چه بخش هایی تشکیل شده و هر بخش چه وظایف و مشخصاتی دارد. چیست؟
- پردازنده گرافیکی (GPU)پردازنده گرافیکی (GPU) چیست؟ بررسی انواع، وظایف و کاربردهادر این مقاله به تاریخچه پردازنده گرافیکی، علت به وجود آمدن آن، انواع GPUها و همچنین مزایا و معایب هر یک متناسب با نیاز کاربران پرداخته شده است چیست؟
معرفی انواع سخت افزار کامپیوتر
همانطور که اشاره شد، هر کامپیوتر متشکل از اجزای سخت افزاری ثابت و کارآمد میباشد. سخت افزار ها به دو نوع سخت افزار داخلی(Internal Hardware) و سخت افزار خارجی( External Hardware) تقسیم میشوند. به طور کلی میتوان گفت سخت افزار های داخلی، اجزای ضروری برای عملکرد صحیح کامپیوتر هستند؛ در حالی که سخت افزار های خارجی به منظور اضافه شدن امکانات یا بهبود عملکرد، به کامپیوتر متصل شده اند. در ادامه به بررسی مهم ترین و ضروری ترین سخت افزار های کامپیوتر میپردازیم.
- مادربورد، بورد اصلی کامپیوتر
- CPU، مغز هوشمند کامپیوتر
- RAM، حافظهی الکترونیکی موقت
- حافظه کش (Cache)، حافظه نهان در پردازنده ها
- منبع تغذیه، Power یا PSU
- کارت گرافیک (GPU)
- هارد، محلی برای ذخیره اطلاعات
- DVD-ROM، بازیابی و ذخیره اطلاعات
- BIOS
- کارت صدا
- کیس یا جعبه کامپیوتر
- موس (Mous)
- صفحه کلید (Keyboard)
- صفحه نمایش (Monitor)
- بلندگو (Speaker)
سخت افزار های داخلی :
سخت افزار های خارجی :
سحت افزار های داخلی
در ابتدا به معرفی سخت افزار های داخلی یا Internal ،که حیاتی ترین بخش های کامپیوتر هستند، میپردازیم.
مادربورد چیست؟ بورد اصلی کامپیوتر
مادربودر، مین بورد یا برد سیستم، مهمترین بخش از سخت افزار کامیپوتر است. این برد تمام ارتباطات بین اجزای مختلف را فراهم میکند و بهعنوان یک مدار برای سیستمهای کامپیوتری تعریف میشود. این بورد حداقل شامل چند واحد پردازش مرکزی است و درواقع فعالیت اصلی پردازشی برروی آن انجام میشود. اگرچه ممکن است اجزای دیگر که به این برد متصل شدهاند، دارای میکروپروسسور (پردازشگر کوچک) خودشان باشند.
دقت کنید که اجزای خارج از مادربورد مانند موس، کیبورد و ... توسط درگاههای اتصال و با کابل به این برد متصل میشوند و مادربورد به آنها سرویس میدهد. (درادامه دربارهی این درگاههای اتصال توضیح داده خواهد شد)
ایسوس، گیگابایت، اینتل و ... از سازندگان اصلی مادربردها هستند. نسخه کنونی مادربردها DDR4 میباشد که از نسل جدید و پیشرفته پشتیبانی میکنند. برای شناسایی تراز مادربرد خود کافی است نرم افزار CPU-Z را نصب کنید و از قسمت Mainboard میزان حجم مادربرد خود را مشاهده کنید. همچنین درهنگام استفاده یا خرید مادربورد، با توجه شود که این برد، از چه سختافزارهایی پشتیبانی میکند و دارای چه درگاههایی برای ارتباط است.
Cpu، پردازنده یا مغز هوشمند کامپیوتر
یکی از انوع سخت افزار کامپیوتر که در بسیاری از کتب مرجع، از cpu باعنوان قلب کامپیوتر یاد میشود اما بااین حال، مغز کامپیوتر نیز لقب خوبی برای این آیسی پرکاربرد است. cpu مخفف Central Processing Unit یا واحد پردازش مرکزی است. واحدی که تمام سرویسها و خواستههای کاربران کامپیوتر، توسط این آن مدیریت میشود. بهعنوان مثال وقتی برروی یکی از دکمههای کیبورد کامپیوتر ضربهای وارد کنید، یک فرمان به cpu ارسال میشود و cpu به درخواست شما رسیدگی میکند. سرعت ساعت یا clock speed نشاندهنده سرعت یک پردازنده برای ارائه خدمات و اجرای دستورات است که برحسب گیگاهرتز (GHZ) سنجیده میشود. این پارامتر فرکانس ساعت cpu را نشان میدهد و هرچه این عدد بزرگتر باشد، به معنای سریعتر بودن cpu هاست.
همچنین یک پارامتر مهم در cpu ها بهعنوان تعداد هسته شناخته میشود. cpuهای چند هستهای قابلیت اجرای دستورات را بهصورت موازی دارا میباشند که این باعث سرعت چند برابری سیستمها میشود و البته بالابردن تعداد هستهها در cpu از یک حدی بیشتر، تأثیر بهسزایی درسرعت ندارد و از راهکارهایی مانند پایپ لاین در معماری کامپیوترپایپ لاین در معماری کامپیوتر؛ کاربردها، مزایا و معایبدر پردازندهها (CPU) به منظور افزايش کارايي از روش پایپلاین استفاده میکنند که در آن تلاش میشود تا با همپوشانی بین مراحل مختلف اجرای دستورات، به تسریع دست پیدا کنیم. در این مقاله قصد داریم مفصلاً در این خصوص صحبت کنیم و چالشهای پیشروی آن را مورد بحث قرار دهیم. استفاده میشود. برای کسی اطلاعات بیشتر دربارهی cpuها به مقاله واحد پردازش مرکزیپردازنده (CPU) چیست؟ بررسی انواع، وظایف و کاربردهاسی پی یو قلب کامپیوتر و کامپیوتر قلب دنیای کنونی است، بنابراین در این صفحه به معرفی و بررسی سیپییو یا همان پردازنده مرکزی (CPU) پرداخته شده، و بطور کامل توضیح دادهایم که CPU از چه بخش هایی تشکیل شده و هر بخش چه وظایف و مشخصاتی دارد. مراجعه کنید.
همچنین یک پردازنده دارای واحدهای زیر میباشد :
- واحد محاسبه و منطق : این واحد عملیات محاسباتی (ضرب، جمع، تفریق، تقسیم)، عملیات مقایسه (کوچکتر و بزرگتر بودن یک عدد) و عملیات منطقی (And، or و ...) را انجام میدهد.
- حافظه ثبات : ثباتها یا رجیسترها برای ذخیرهسازی موقت اطلاعات بهکار میروند. هر cpu شامل تعدادی ثبات برای ذخیرهسازی موقت دیتا میباشد.
- واحد کنترل : این واحد وظیفهی کنترل دریافت دادهها از واحد ورودی، کنترل عملیات داخلی CPU و کنترل ارسال اطلاعات به واحد خروجی میباشد.
- حافظه سریع : حافظه سریع یا حافظه کش، یکی از راههای افزایش سرعت cpuهاست که در ادامه آنرا شرح میدهیم.
حافظه رم چیست؟ (RAM)، حافظهی الکترونیکی موقت
حافظه RAM که یکی از انواع حافظه اصلی کامپیوتر و مخفف Read Access Memory است، یک حافظهی موقت و بسیار مهم در سخت افزار کامپیوتر است. این حافظه در اسلاتهای حافظه و در مادربورد تعبیه شده است. کاربرد اصلی این حافظهها در هنگام پردازش اطلاعات است. هنگامی که شما یک برنامه را در سیستم خود باز کنید، تمام فرآیندهای این برنامه درون حافظه رم قرار گرفته و cpu فرآیندهای درون این حافظه را اجرا میکند. بنابراین cpu تمام اطلاعات اجرایی خودرا از این حافظه موقتی دریافت میکند. همانطور که اشاره شد، حافظه رم یک حافظه موقتی که با خاموش شدن سیستم، تمام اطلاعات درون آن از بین میرود.
هرچه حافظهی رم شما بیشتر باشد، برنامههای بیشتری را میتوان درون آن قرار داد. به همین خاطر هرچه برنامهی شما سنگینتر باشد، به حافظهی رم بیشتری برای اجرا احتیاج دارد.
حافظهی رم کندترین جزء در مادربورد است که این کند بودن بهدلیل خازنهای استفاده شده درون این حافظه است. صنعت امروزه در تلاش برای بالابردن سرعت این حافظههاست و با ایدههایی مانند استفاده از حافظه Cache یا حافظه کش باعث افزایش سرعت اجرای دستورات میشود.
حافظه Cache، حافظه نهان در پردازنده ها
حافظه نهان یکی دیگر از سخت افزارهای کامپیوتر است و ایدهای برای افزایش سرعت دستیابی به اطلاعات است. این حافظهها از نوع SRAM و بسیار سریعتر از RAM هستند (حافظههای رم از نوع DRAM هستند).
اطلاعات اجرایی از هارد اصلی که بسیار حافظهی کندی است، به RAM منتقل میشود، اما بهدلیل سرعت بسیار بالای cpu، حافظهی RAM هم بسیار کند محسوب میشود و برای رفع این مشکل از حافظههای کش استفاده میشود.
حال کاربرد این حافظه را با مثالی در دنیای واقعی بررسی میکنیم. فرض کنید که یک نفر قصد رفتن به کتابخانه و دریافت چندین کتاب را دارد. این فرد به کتابخانه میرود و یک کتاب را دریافت میکند و کتابخانه را ترک میکند. این فرد بعد اتمام خواندن این کتاب، نیاز دارد که کتابی دیگر را تهیه کند. برای تهیه کتاب دیگر، باید مجددا به کتابخانه مراجعه کند که اینکار وقت زیادی از این فرد را در راه کتابخانه تلف میکند. بهترین ایده این است که درهنگام تهیه اولین کتاب، چندین کتاب دیگر که بعدا به آنها احتیاج دارد را تهیه کند. این کار باعث میشود که هنگام اتمام یک کتاب، مجددا به کتابخانه مراجعه نکند و باعث صرفهجویی در وقت شود.
cpu نیز هنگام اجرای دستورات موجود در RAM، مقداری از این دستورات را به حافظه کش که نزدیک cpu است منتقل میکند (درواقع یک بلاک را که حاوی چندین دستور است را به کش منتقل میکند) و بار بعد که هدف اجرای آن دستورات را داشته باشد، درصورت وجود این دستورات در کش، دیگر به حافظهی RAM رجوع نمیکند و آن دستور را از کش دریافت میکند که این باعث افزایش سرعت بسیار زیادی در اجرای دستورات خواهد شد. بهعنوان مثال اگر سرعت دستیابی به اطلاعات رم 100ns باشد، سرعت دستیابی به اطلاعات موجود درکش، در حد 1ns خواهد بود. بنابراین اگر دستورات خواسته شده توسط cpu، در کش موجود باشد، سرعت دستیابی به اطلاعات آن دستور افزایش مییابد. اما مشکلی که دراینجا وجود دارد، این است که نمیتوان حافظههای کش را به بزرگی حافظه رم و در حد گیگابایت ساخت، زیرا اینکار مشکلاتی از قبیل قیمت بالا و همچنین پایین آمدن سرعت بهوجود میآورد. بنابراین حافظههای کش موجود در سیستمها بسیار کوچکتر از حافظههای رم هستند و بنابراین نمیتوان تمام اطلاعات موجود در رم را به کش منتقل کرد. بااین حال اگر حافظهی کش پر شود، برای اجرای دستورات بعدی، مقداری از دستورات درون کش پاک شده و برای دسترسی به این اطلاعات حذف شده، cpu باید مجددا به رم رجوع پیدا کند. مشاهده شد که حافظه کش یکی از مهمترین انواع سخت افزار کامپیوتر محسوب میشود.
منبع تغذیه، Power یا PSU
PSU مخفف Power Supply Unit و به معنای واحد تأمین تغذیه است. منبع تغذیه یکی دیگر از سخت افزارهای کامپیوتر است که وظیفهی تأمین انرژی الکتریکی در اجزای مختلف کامپیوتر را دارد. بدون وجود این منبع تغذیه، اجزای شما هیچ عملی را نمیتوانند انجام دهند. این منبع، درواقع برق شهر که یک برق Ac و دارای ولتاژ 220 ولت است را به برق DC (اجزای کامپیوتر به این نوع برق احتیاج دارند) در ولتاژهای مختلفی تبدیل میکند.
PSU بهصورت یک جعبه درون کیس تعبیه شده است. این منابع درواقع منابع سوئیچینگ هستند و معمولا ولتاژهای 5، 5-، 12، 12-، 3.3 را با جریانهای در حدود 5آمپر تولید میکنند. همچنین این منابع دارای یک خنککننده درون خود هستند که علاوه بر خنک کردن خود، جریان هوا را درکیس برقرار میکنند.
کارت گرافیک، GPU
کارت گرافیک نوعی دیگر از پردازندههاست. این سخت افزار کامپیوتر با عناوین کارت ویدئو، آداپتور ویدئو، آداپتور گرافیک، آداپتور نمایشگر و ... از آن صحبت میشود. این کارت وظیفهی پردازش دادههای گرافیکی مانند رنگ، تصاویر دو بعدی و سه بعدی، ویدئوها و نمایش آنها برروی نمایشگرها را برعهده دارد. کارت گرافیک از تعداد بسیار زیادی هسته تشکیل شده است که بتواند موازات دراجرای دستورات را افزایش دهد. به همین دلیل برای اجرای برنامههای گرافیکی مانند بازیها و نرمافزارها و ...، گرافیک وارد عمل میشود و آنهارا پردازش میکند. خروجی و ورودیهای کارت گرافیکها به چند شکل DVI ،HDMI و VGI تقسیم بندی میشوند. کارت گرافیکهای Intel بیشتر در زمینه نرمافزارها طراحی میشوند و کارت گرافیکهای AMD Redon بیشتر در زمینه بازیهای پیشرفته (گیمینگ) استفاده میشوند. برای کسب اطلاعات بیشتر به مقاله جی پی یو چیستپردازنده گرافیکی (GPU) چیست؟ بررسی انواع، وظایف و کاربردهادر این مقاله به تاریخچه پردازنده گرافیکی، علت به وجود آمدن آن، انواع GPUها و همچنین مزایا و معایب هر یک متناسب با نیاز کاربران پرداخته شده است مراجعه کنید.
هارد دیسک، محلی برای ذخیره اطلاعات
هارد دیسک یا به اختصار HDD (Hard Disc Drivers)، یکی دیگر از انواع سخت افزار کامپیوتر و دستگاه ذخیره ساز اطلاعات بهصورت الکترومکانیکی است که سیستمعامل، نرمافزارها و دادهها در آن ذخیره میشوند. ذخیرهسازی دیتا دراین هاردها بهصورت مغناطیسی صورت میگیرد که دارای بشقابهای گردان با سرعت بالا و پوشیده شده از مواد مغناطیسی هستند. این بشقابها یا پلاترها (Platters) با هدهای مغناطیسی (این هدها برروی بازوی محرک قرار میگیرند) جفت میشوند و عمل نوشتن و خواندن برروی صفحه را انجام میدهند. شکل زیر نمایی از هارد دیسک را نشان میدهد :
همانطور که مشاهده میکنید، پلاتر و بازوی مغناطیسی، نقش اصلی در ذخیره سازی و دریافت اطلاعات را برعهده دارند. همچنین این حافظه دارای بخشهای دیگری به شرح زیر میباشد :
- Actuator : این قسمت را میتوان مغز هارد نامید که وظیفهی کنترل قسمتهای مختلف را دارد.
- Actuator Arm : مرکزی ترین نقطه هارد است که به بازوی مغناطیسی متصل است.
- Spindle : از طریق این قسمت، هدها میتوانند داده و اطلاعات را برروی نقاط مختلف هارد بخوانند یا بنویسند.
هاردها به دودسته HDD و SSD تقسیم بندی میشوند. هاردهای HDD قابل استفاده برای کاربران عادی است که نیازی به سرعت بالا ندارند اما هاردهای SSD برای کاربرانی است که نیاز به سرعت بالا در اجرای نرمافزارها دارند. هاردهای SSD جهت پردازش اطلاعات در سیستمعاملها با بالاترین سرعت استفاده میشوند.
هارد SSD
Solid-State Drive یا به اختصار ssd یکی از سخت افزارهای کامپیوتر که با هدف دسترسی سریع به اطلاعات ذخیره شده، طراحی شده است. این هاردها جایگزینی برای هارد دیسکهای سنتی هستند. اگرچه از نظر ظاهری تقریبا شبیه به هارددیسکهای سنتی هستند اما هیچ قطعهی متحرکی درون خود ندارند و همین باعث افزایش سرعت، مصرف انرژی کمتر و قابلیت اطمینان بیشتر در این هاردها شده است. بااستفاده از این هاردها، میتوانید اطلاعات ذخیره شده و ثابت در هارد مانند نرمافزارها، سیستمعامل و ... را سریعتر به اجرا برسانید.
DVD-ROM، بازیابی و ذخیره اطلاعات
این مدل از سخت افزار کامپیوتر، وظیفه بازیابی و ذخیره دادهها را برروی دیسکهای نوری مانند dvd، cd، bd را برعهده دارند. DVD-ROM ها به مادربورد متصل هستند و میتوانند اطلاعات زیادی را توسط آن دریافت و ذخیره سازی کنند و همچنین برق خودرا از پاور کامپیوتر دریافت میکنند. همچنین توسط نرمافزارهایی مانند Nero و ImgBurn میتوان فایلهایی از قبیل موسیقی، فیلم و ... را از طریق DVD-ROM برروی دیسکهای نوری آپلود کرد. امروزه DVD-ROMهای خارجی با نام slim portable توانستهاند جای DVD-ROMهای داخلی را بگیرند.
بایوس چیست؟ (BIOS)، یکی از سخت افزارهای زیر دسته حافظه ROM
BIOS که مخفف Basic Input/Output System یا سامانه پایه ورودی و خروجی است، یک سختافزار کامپیوتر محسوب میشود که برروی مادربورد تعبیه شده و محتویات لازم برای اجرای نرمافزار سیستمعامل را درون خود دارد. در واقع بایوس، سیستمعامل را بارگذاری یا اصطلاحا Load میکند و وظیفه تست کردن سختافزارهای حیاتی که برای روشن شدن سیستمعامل نیاز است را بر عهده دارد .
بایوس یک Firmware (چیزی بین سختافزار و نرمافزار) است. در واقع Firmware نرمافزاری است که درون سختافزار قرار دارد. به این معنا که بایوس یک سختافزار موجود در مادربورد است که یک نرمافزار با وظایف زیادی برروی آن نصب شده است. این حافظه زیر دستهای از حافظهی ROM (حافظه فقط خواندنی و غیرقابل پاک شدن) است و چون بایوس یک حافظه Flash ROM یا EEPROM است، میتوان اطلاعات آنرا توسط تولید ولتاژ، پاک و مجددا آپدیت کرد و همچنین برخلاف حافظههای RAM، با قطع برق اطلاعات درون آن از بین نخواهد رفت.
کارت صدا، مبدل صوتی سخت افزارهای کامپیوتر
یکی دیگر از انواع سخت افزار کامپیوتر که وظیفهی انتقال سیگنالهای صوت از فایلهای صوتی به مراکز پخش صدا مانند بلندگو را برعهده دارد. هنگامی که یک صوت یا یک موسیقی را پخش میکنید، cpu اطلاعات آنها را دریافت میکند و به کارت صدا تحویل میدهد، کارت صدا اطلاعات را پردازش و روی خروجی خود که به بلندگو متصل است، قرار میدهد. درواقع کارت صداها را میتوان واسطی بین cpu و بلندگو دانست. برای استفاده از کارت صداها، باید درایور مورد نیاز آنها نصب شود. کارت صدا همچنین در کارتهای ویدئویی با کابل HDMI قرار دارد تا صدارا همراه با ویدئو به خروجیهای خود منتقل کنند.
درگاه های ارتباطی
درگاهها یا پورتها درواقع محلهایی برای اتصال وسایل جانی مانند موس، کیبورد و ... به سیستم استفاده میشود. درگاهها از نظر سرعت انتقال داده دارای دو دستهبندی کلی برمبنای نوع انتقال هستند.
- درگاه سری یا سریال : این درگاه اطلاعات را بهصورت بیت به بیت انتقال میدهد و برای مواردی مناسب است که به سرعت بالایی احتیاج نداریم. نمونهای از درگاه سری، درگاه PS/2 است که در ادامه بهآن اشاره میکنیم.
- درگاه موازی یا پارالل : برخلاف درگاه سری، این درگاه برای انتقال اطلاعات با سرعت بیشتری استفاده میشود. این نوع درگاه هشت بیت را از طریق هشت خط موازی انتقال میدهد و برای اتصال دستگاههایی مانند اسکنر و چاپگر استفاده میشود.
شکل زیر برخی از این درگاهها را نشان میدهد :
حال به معرفی برخی از این درگاهها میپردازیم :
- PS/2 : این درگاه برای اتصال موس و کیبوردهای قدیمی استفاده میشود.
- پورت ETHERNET یا پورت LAN : جهت شبکه کردن سیستمها و تبادل اطلاعات استفاده میشود.
- درگاه USB : یک درگاه سریع است که برای اتصال لوازم جانبی مانند کیبورد، موس، بلندگو، چاپگر و ... استفاده میشود.
- پورت VGA : محل اتصال کابل دیتای مانیتور یا بهعبارت دیگر پورت اتصال مانیتور به گرافیک موجود برروی بورد است.
- پورت COM : در گذشته برخی مانیتورها و حتی موسها از این قسمت به سیستم متصل میشدهاند که با ارتقا در نوع اتصال این وسایل، میتوان گفت که این پورتها تقریبا کاربرد خاصی ندارند.
ورودی و خروجی، I/O
ورودی و خروجی یا همان I/O، درواقع راهی برای برقراری ارتباط بین سیستم پردازش اطلاعات و اجزای دیگر (مانند انسان، برنامههای کامپیوتری و ...) است. دستگاههای ورودی مانند موس، کیبورد و ... هنگام تغییر توسط عوامل بیرونی، یک وقفه I/O به CPU ارسال میکنند و CPU توسط واحدی بهنام DMA، به آنها سرویس میدهد. دقت کنید که خروجیهای دستگاههای مانند کیبورد، موس و ...، ورودی برای CPU هستند و خروجی کار CPU که شامل اجرای دستورات است، برروی دستگاههای خروجی مانند هدفون، نمایشگر و ... میباشد. برای بررسی اطلاعات دقیق I/O به مقاله دستگاه های ورودی و خروجی کامپیوتربررسی و آموزش ورودی و خروجی های کامپیوتردر این صفحه به معرفی ورودی و خروجی کامپیوتر و بررسی انواع دستگاه های ورودی و خروجی کامپیوتر نظیر کارت گرافیک، اسکنر و ... پرداخته شده است مراجعه کنید.
سخت افزارهای خارجی
دراین بخش به معرفی سخت افزارهای کامپیوتر که بهعنوان سختافزار خارجی یا External شناخته میشوند، صحبت میکنیم. این سختافزارها بسیار ساده و عمومی هستند اما بهتر است اطلاعاتی دربارهی آنها داشته باشید.
کیس یا جعبه کامپیوتر
کیس کامپیوتر یک محفظه فلزی یا پلاستیکی است که اجزای مهم کامپیوتر را درون خود قرار داده است و درواقع مکانی برای برقراری ارتباط میان اجزا محسوب میشود و یک پک کامل از سخت افزارهای کامپیوتر میباشد.
کیسها در شکلها و اندازههای مختلفی وجود دارند.
- کیس رومیزی صاف (Desktop case) که روی میز قرار میگیرد و مانیتور را معمولا روی آن میگذارند.
- شکل بعدی کیس را اغلب دیدهایم و به نام برج بلند (tower case) میشناسند که در کنار مانیتور یا روی زمین قرار میگیرد.
در عکس زیر میتوانید شکل کیس رومیزی (Desktop case) و برج بلند (tower case) را مشاهده کنید:
- کامپیوترهای همهکاره (All-in-one) با قطعات داخلی تعبیه شده در مانیتور عرضه میشوند، به همین دلیل نیاز به قاب جداگانه ندارند. در واقع شما یک مانیتور میبنید که هم کیس است و هم مانیتور. در زیر شکل یک All in one را که محصول شرکت hp است و صفحه 34 اینچی دارد را میبینید، در پشت این صفحه مادربورد، پردازنده، رم و هر چه درون یک کامپیوتر وجود دارد قرار گرفته است.
یک کیس کامپیوتر کامل، شامل تمامی اجزای کامپیوتر میشود که در فوق به شرح آنها پرداختیم.
مانیتور یا نمایشگر (Monitor)
مانیتور یا نمایشگر کامپیوتر یا صفحه نمایش، یکی از سخت افزارهای کامپیوتر به حساب میآید که ویدئو و اطلاعات گرافیکی پردازش شده توسط کارت گرافیک (داخل کیس) را از طریق کابل در نمایشگر نشان میدهد و انواع مختلفی دارد. نمایشگرها در نگاه اول شبیه به تلویزیون هستند؛ اما رزولوشن نمایشگرها بالاتر است. اکثر مانیتورها دارای دکمههایی برای کنترل هستند که به شما امکان می دهد تنظیمات نمایش مانیتور خود را تغییر دهید. برخی از مانیتورها دارای بلندگوهای داخلی نیز هستند.
مانیتورهای قدیمی از نمایشگرهای CRT (لوله اشعه کاتدی) استفاده میکردند و علاوه بر بزرگتر و سنگینتر بودنشان فضای بیشتری را نیز اشغال میکردند.
نمایشگرهای جدیدتر معمولاً دارای نمایشگرهای LCD (نمایشگر کریستال مایع) یا LED (دیود ساطع کننده نور) هستند.
نمایشگرهای امروزه را بسیار نازک و سبک میسازند و اغلب به آنها نمایشگرهای صفحه تخت میگویند.
بصورت تخصصیتر میتوانیم بگوییم که مانیتور یک دستگاه خروجی الکترونیکی است که با عنوان ترمینال نمایش ویدئو (video disply terminal) یا واحد نمایش ویدئو (video display unit) شناخته میشود. مانیتور اطلاعاتی از قبیل عکسها، متنها، ویدئوهای و اطلاعات گرافیکی را توسط کارت گرافیک موجود در کامپیوتر و توسط کابلهایی نظیر HDMI و DVI، برروی صفحه نمایش میدهد. در زیر عکسی از مانیتورهای جدید را مشاهده میکنید:
موس کامپیوتر (Mouse)
موس کامپیوتر یکی از سخت افزارهای جانبی کامپیوتر محسوب میشود و یکی دیگر از ابزارهای مهم برای برقراری ارتباط با کامپیوتر است. معمولاً به عنوان یک دستگاه اشارهگر شناخته میشود و به شما امکان میدهد به اشیاء روی صفحه اشاره کنید و روی آنها بروید و روی آنها را کلیک کنید و آنها را انتخاب کنید.
دو نوع اصلی ماوس وجود دارد: نوری و مکانیکی
- ماوس نوری از یک چشم الکترونیکی برای تشخیص حرکت استفاده میکند.
- ماوس مکانیکی از یک توپ غلتان برای تشخیص حرکت استفاده میکند.
در دنیای پیشرفته امروز حتی ماوسها نیز بهینه و کاربردیتر شدند تا هنگام استفاده حس بهتری به کاربر بدهند. بسیاری از مردم ماوسهای جدید را راحتتر میدانند و همچنین نسبت به ماوسهای سنتی فضای میز کمتری اشغال میکنند.
این قطعه، یک اشاره گر دستی است که روند کار آن تشخیص حرکت دوبعدی در سطح است. این حرکت معمولا بهعنوان حرکت اشارهگر روی نمایشگر تعبیر میشود که امکان کنترل رابط گرافیکی یک کامپیوتر را فراهم میکند و بهعبارتی برای دسترسی به بخشهای گرافیکی به آن نیاز داریم. درهنگام تغییر حرکت موس در 2 بعد x, y، یک وقفه ورودی برای cpu ارسال میشود و cpu به این وقفه سرویس میدهد و عملیات گرافیکی برای روی صفحه نمایشگر اعمال میشود. موسها بهطور کلی به دو دستهی بیسیم و سیمدار تقسیم بندی میشوند که کاربران برحسب علاقه و نیاز، یکی از آنها را انتخاب میکنند.
در زیر دونمونه ازانواع ماوسهای جدید را معرفی میکنیم:
Trackball
یک توپ است که میتواند آزادانه بچرخد.
به جای حرکت دادن دستگاه مانند ماوس، می توان توپ را با انگشت شست خود چرخاند تا نشانگر حرکت کند.
Touchpad
پد لمسی، یک پد حساس به لمس است که به شما امکان میدهد با حرکت انگشت، نشانگر را کنترل کنید. پد لمسی در رایانههای لپ تاپ رایج است.
صفحه کلید (Keyboard)
کیبورد کامپیوتر از دیگر انواع سخت افزار کامپیوتر محسوب میشود که در مدلهای بیسیم و سیمدار عرضه میشود. کیبورد متشکل از تعداد زیادی دکمهی مکانیکی است که عمل سوئیچ الکترونیکی را انجام میدهند. درهنگام فشردن دکمههای کیبورد، یک وقفه ورودی به cpu ارسال میشود و cpu براساس ساختار و واحدهایی که دارد، به این وقفه سرویس میدهد و بلافاصله عملیات مورد نظر برروی کامپیوتر اعمال میشود. کیبورد مانند موس نیز بسیار حائز اهمیت است و بدون آن، نمیتوان از امکانات کامپیوتر بهره برد.
لوازم جانبی کامپیوتر
ابتداییترین وسایل موردنیاز برای راه اندازی کامپیوتر معمولاً شامل کیس، مانیتور، صفحه کلید و ماوس است، اما طبق نیاز وشرایط میتوانید انواع مختلفی از دستگاهها را به پورتهای اضافی کامپیوتر خود وصل کنید، به این دستگاهها لوازم جانبی میگویند. بیایید نگاهی به برخی از رایجترین آنها بیندازیم.
چاپگرها (Printer)
چاپگر برای چاپ اسناد، عکسها و هر چیز دیگری که روی صفحه نمایش شما ظاهر میشود استفاده میشود.
انواع مختلفی از چاپگرها از جمله چاپگرهای جوهرافشان، لیزری وجود دارد. حتی چاپگرهای همه کاره نیز وجود دارد که میتوانند اسناد را اسکن و کپی کنند.
اسکنرها (Scanners)
یک اسکنر به شما امکان میدهد یک تصویر یا فایل فیزیکی را کپی کنید و آن را به عنوان یک تصویر دیجیتال (قابل خواندن توسط رایانه) در کامپیوتر ذخیره کنید. بسیاری از اسکنرها به عنوان بخشی از یک چاپگر همه کاره مورداستفاده قرار میگیرند.
بلندگوها/هدفونها (Speakers/headphones)
بلندگوها و هدفونها دستگاههای خروجی هستند، به این معنی که اطلاعات را از کامپیوتر به کاربر ارسال میکنند . بسته به مدل، آنها ممکن است به درگاه صوتی یا پورت USB متصل شوند و به شما امکان شنیدن صدا و موسیقی را میدهند.
میکروفون (Microphones)
میکروفون نوعی دستگاه ورودی است که اطلاعات را از کاربر دریافت می کند. میتوانید یک میکروفون را برای ضبط صدا یا صحبت با شخص دیگری از طریق اینترنت متصل کنید. بسیاری از کامپیوترهای لپ تاپ دارای میکروفون داخلی هستند.
دوربین های وب (Web cameras)
دوربین وب یا وِب کَم نوعی دستگاه ورودی است که می تواند فیلم ضبط کند و عکس بگیرد. همچنین میتواند ویدیو را از طریق اینترنت به صورت آنلاین انتقال دهد که امکان چت ویدیویی یا کنفرانس ویدیویی با شخص دیگری را فراهم میکند. بسیاری از وب کم ها دارای میکروفون نیز هستند.
کنترلر و جوی استیک بازی(Game controllers and joysticks)
یک کنترلر بازی برای کنترل بازی های رایانهای استفاده میشود. بسیاری از انواع دیگر از کنترلرها، از جمله جوی استیک، وجود دارد که می توانید از ماوس و صفحه کلید خود برای کنترل بیشتر بازیها نیز استفاده کنید.
دوربین های دیجیتال (Digital cameras)
یک دوربین دیجیتال به شما امکان میدهد عکسها و فیلمها را با فرمت دیجیتال بگیرید. با اتصال دوربین به پورت USB کامپیوتر، میتوانید تصاویر را از دوربین به کامپیوتر منتقل کنید.
تلفنهای همراه، پخشکنندههای MP3، تبلتها و سایر دستگاهها
هر زمان که یک دستگاه الکترونیکی مانند تلفن همراه یا پخشکننده MP3 خریداری میکنید، بررسی کنید که آیا کابل USB دارد یا خیر اگر کابل وجود داشته باشد، به این معنی است که به احتمال زیاد میتوانید آن را به رایانه خود وصل کنید.
- تفاوت سخت افزار و نرم افزار
- سخت افزار، به قسمت های ملموس و محسوس کامپیوتر گفته میشود که دستورالعمل های نوشته شده را ذخیره و اجرا میکند.
- نرم افزار، قسمت غیرقابل لمس دستگاه است که برای کاربر، امکان تعامل با سخت افزار و صدور فرمان جهت اجرای اعمال مورد نظر را فرهم میکند
- سیستم عامل و سیستم های مربوط به آن
- برنامه هایی که اعمال مشخصی را کنترل میکنند
- برنامه های کاربردی که معمولا روی داده هایی که کاربر وارد میکند، عملیاتی انجام میدهند
حضور نرم افزار مخرب یا بد افزار، مانند ویروس ها، تروجان ها، نرم افزار های جاسوسی و کرم ها، میتواند به برنامه های کامپیوتر و سیستم عامل آن، آسیب جدی وارد کند. گرچه سخت افزار توسط بد افزار مورد تهدید قرار نمیگیرد.
از آنجا که سخت افزار و نرم افزار، برای این که کامپیوتر قادر به تولید خروجی مناسب باشد، به یکدیگر وابسته هستند، نرم افزار باید طوری طراحی شود، که با سخت افزار مورد نظر سازگار باشد.
معماری فون نویمان، Von Neumann architecture
حال که دربارهی انواع سخت افزار کامپیوتر صبحت کردیم، وقت آن است که این معماری سختافزاری مهم را بررسی کنیم. درگذشته، سیستمهای کامپیوتری دارای عملکرد مشخص و ثابت بودند، همانند مدارهای درون لباسشویی، یخچال و یا یک ماشین حساب ساده. این مدارات غیرقابل ارتقا هستند و فقط وظیفه دارند کار مشخصی را انجام دهند و اگر بخواهیم وظیفهی آنها را تغییر دهیم، کار بسیار سختی است و شاید غیرقابل امکان باشد. آقای فون نویمان با ایدهی کامپیوترهای برنامهریز، توانست دنیای جدیدی را خلق کند، بهگونهای که کامپیوتر بتواند برنامهای را اجرا کند و برای اجرای آن برنامه از یک حافظه موقت (RAM) استفاده کند تا دستورات را درآن ذخیره کند. این طرح باعث شد تا درصورت نیاز، وظیفهی کامپیوترها را فقط با اعمال برنامههای جدید، تغییر داد و کارهای متعددی را از کامپیوتر درخواست کرد.
الگوریتمی که نویمان برای پردازندهها ارائه داد دارای بخشهای زیر است :
- Fetch یا گرفتن دستورات از حافظه : cpu با تولید آدرس دستورات، آنها از حافظه دریافت و درثباتی بهنام IR یا Instruction Fetch قرار میدهد.
- Decode : دیکد کردن به معنای درک دستور موجود در رم توسط cpu است. بهعنوان مثال پردازنده برای اینکه یک دستور خاصی را انجام دهد، توسط op code دستور، میتواند درک کند که این دستور برای چه کاری است تا بتواند آن کار را انجام دهد. به انجام این عمل decode کردن میگویند.
- Execute : این عمل دقیقا بعد از دیکد کردن انجام میشود. بعد از عمل دیکد نوبت به اجرای دستور رسیده که این بخش وظیفهی آنرا برعهده دارد.
- Write Back : این عمل برای مشخص کردن Flag های خاصی بهکار میرود. بهعنوان مثال بعد از انجام دستورات یک وقفه، cpu وظیفه دارد یک عمل write back بهمنظور مشخص کردن پاسخ به وقفه انجام دهد.
رشته سخت افزار کامپیوتر
رشته مهندسی کامپیوتر سخت افزار یکی از جذابترین و کارآمدترین رشتههای کامپیوتر محسوب میشود. این رشته به بررسی اجزای درونی یک سیستم و سخت افزار کامپیوتر میپردازد و شمارا با نحوهی کارکرد سیستمها آشنا میکند. اگر دانشجوی رشته سختافزار کامپیوتر باشید، بهدلیل آشنایی زیاد با ساختار داخلی کامپیوترها، میتوانید در حوزههای برنامهنویسی، موفقتر عمل کنید زیرا شما با اجزای درونی سیستم، آشنایی زیادی دارید و کدهای تولید شده توسط شما، میتواند بسیار کارآمد و بهینهتر باشد. این رشته در کشورهای تولید کننده بسیار دارای بازارهای متعددی است اما در ایران بهدلیل نبود شرکتهای زیاد در حوزه تولید قطعات، بازارکار ایدهآلی در بعضی از شاخههای این رشته ندارد که بااین حال دانشجویان این رشته میتوانند درحوزههای برنامهنویسی سختافزار و طراحی مدارها، بسیار موفق عمل کنند.
معرفی چهار کتاب برای آشنایی با سخت افزار
کتابها منبع بسیار مناسبی برای محققین و عاشقان علوم مختلف هستند. توسط این کتابهاست که میتوانید دانش خودرا در زمینههای مختلف افزایش دهید. در ادامه به معرفی چهار کتاب درحوزه سختافزار کامپیوتر میپردازیم :
کتاب Understanding Computers, Smartphone and the Internet
این کتاب بسیار ساده به مفاهیم کامپیوتر اشاره میکند. یعنی درواقع این کتاب برای افرادی است که میخواهند به این سوال که کامپیوترها چگونه کار میکنند، برسند. این کتاب هیچ پیشنیاز خاصی مانند دانش ریاضی ندارد و بهراحتی میتوان مطالب آنرا درک کرد.
کتاب Understanding the digital worlds
این کتاب نحوهی کارکرد سختافزار، نرمافزار و شبکه را نشان میدهد. اینکه آیا ما واقعا قدرت کامپیوترها را درک میکنیم؟. موضوعات این کتاب همچنین شامل چگونگی ساخت کامپیوترها و نحوهی محاسبات آنها میشود و کمی دربارهی برنامه نویسی توضیح داده شده است.
کتاب Computer Hardware
دراین کتاب به بررسی مفاهیم سختافزاری از پایه پرداخته میشود. مفهوم بیت، بایت، پردازنده و ... در این کتاب توضیح داده شده است. سختافزار کامپیوتر با تمام اصطلاحات آن میتواند خیلی پیچیده باشد که این کتاب با هدف ساده توضیح دادن نوشته شده و هدف نشان دادن پیچیده نبودن سختافزار کامپیوتر است.
کتاب Computer Organization And Desgin
این کتاب نوشته شده توسط Patterson و Hennesy است که یک کتاب جامع دربارهی معماری کامپیوتر آموزش جامع معماری کامپیوتر در مهندسی کامپیوتر، معماری کامپیوتر مجموعهای از قوانین و روشهایی است که به چگونگی طراحی، کارکرد، سازماندهی و پیاده سازی (ساخت) سیستمهای کامپیوتری میپردازد، در این صفحه به بررسی و آموزش کامل معماری کامپیوتر پرداخته شده است هاست. این کتاب در دانشگاههای برتر کشور و همچنین دنیا تدریس میشود و هدف آن درک کامل سیستمهای کامپیوتری تا جزئیترین اجزا است. بنابراین این کتاب میتواند بسیار مناسب برای درک بهتر سختافزار باشد و خواندن آن توصیه میشود.
میتوانید برای مشاهدهی کتابهای سطح بالا و تاپ در معماری کامپیوتر، به این مقاله مراجعه کنید.
جمع بندی
سختافزارها درواقع نقش اصلی در وجود کامپیوترها را دارند. بدون وجود سختافزار بهینه و کارآمد، کامپیوترها نمیتوانند وظایف خودرا بهدرستی انجام دهند. همانطور که درمقاله مشاهده کردید، هربخش از کامپیوتر نقش بسیار مهمی در ارائهی وظایف دارند. همچنین تمام اجزای کامپیوتر به این مقاله ختم نمیشوند و برای کسب اطلاعات بیشتر دربارهی سخت افزار کامپیوتر بهتر است مقالات متعدد و همچنین کتابهای زیادی را مطالعه کنید.
سخت افزار کامپیوتر شامل چه مواردی میشود، آیا در این صفحه تمامی اینها توضیح داده شده است؟
سخت افزار کامپیوتر شامل مواردی همچون : 1- کیس یا جعبه کامپیوتر 2- مادربورد، بورد اصلی کامپیوتر 3- Cpu یا پردازنده 4- رم (RAM) یا همان حافظهی الکترونیکی موقت 5- حافظه کش (Cache)، حافظه نهان در پردازنده ها 6- Power یا منبع تغدیه 7- GPU و کارت گرافیک 8- هارد 9- DVD-ROM که برای خواندن سی دی و رایت سی دی استفاده میشود 10- BIOS که یکی از سخت افزارهای زیر دسته حافظه رم است. 10- کارت صدا 11- درگاه های ارتباط 12- دستگاه های ورودی و خروجی است. بله- در این صفحه تمامی این موارد به تفصیل بررسی شده است
ویندوز سخت افزار است یا نرم افزار
ویندوز یک سیستم عامل از بین سیستم عامل های بسیاری است که وجود دارد، سیستم عامل هایی نظیر لینوکس، مکینتاش و ... و همه سیستم عامل ها نرم افزار هستند
هر فردی با پا گذاشتن به دنیای جذاب برنامه نویسی به دنبال هدفی است، یکی برای ارتقای شغلی، یکی برای افزایش درآمد، بعضی برای سرگرمی و بعضی نیز برای اهداف متنوع، اما اولین سوالی که هر فردی که میخواهد وارد دنیای برنامه نویسی شود از ما میپرسد این است که بهترین زبان برنامه نویسی برای شروع کدام است؟ پاسخ به این سؤال در ادامه این نوشتار به طور کامل آورده شده است. با ما همراه باشید، قطعاً تا انتها مطالبی مفید خواهید خواند.
برنامه نویسی چیست؟
کد نویسی یعنی به رایانه بگوییم چه کاری انجام دهد و چگونه آن را انجام دهد، این وظیفه برنامه نویس است که این را به کامپیوتر بگوید. کامپیوترها زبان انسان را نمیفهمند، آنها فقط باینری صحبت میکنند (یعنی 0 و 1)، اما کدنویسی به صورت باینری زمانبر و بسیار مستعد خطا است. بنابراین، انسانها زبان های برنامه نویسی رایانهای را اختراع کردند که درک آسانتری برای انسان داشته باشد.
انواع زبان های برنامه نویسی
زبان های برنامه نویسی، در انواع رویه ای (Procedural)، تابع گرا (Functional)، شی گرا (Object-oriented)، منطقی (Logic)، دستوری (Ipmrative) و زبان های اسکریپت نویسی (Scripting) طراحی شده اند. همچنین میتوان آن ها را از مناظر زیر دسته بندی کرد :
- Front-end و Back-end
- سطح بالا و سطح پایین
- مفسری و کامپایلری
اگر تمایل دارید با انواع زبان های برنامه نویسی بیشتر آشنا شوید، میتوانید به صفحه لیست زبان های برنامه نویسیلیست زبان های برنامه نویسی + تاریخچه، کاربرد و رتبه هر یکاین مقاله عالی لیست زبان های برنامه نویسی و تاریخچه و کاربرد آنها را بررسی کرده، همچنین محبوبیت هر یک از زبان های برنامه نویسی در بین سایر زبانها بررسی کرده سر بزنید.
10 تا از بهترین زبان های برنامه نویسی برای شروع در سال 2023
پشت هر برنامه الکترونیکی که باز میکنید و میبیندید تا کار شما را انجام دهد هزاران خط وجود دارد، هر خط کد با دانش و ایده برنامهنویس یا حتی برنامهنویسان متعددی ساخته شدهاند تا کار بشر را سادهتر کنند. طبق آمار اداره کار ایالات متحده آمریکا، مهندسان نرم افزار در سال 2022 به طور متوسط در حدود 119020 دلار در سال دریافتی داشتهاند که این مبلغ تا سال 2030 حداقل حدود 25 درصد هم افزایش خواهد داشت، لازم به ذکر است بیشتر این مهندسان کارهای برنامه نویسی انجام دادهاند.
میبینیم که برنامهنویسی یک شغل جذاب و پر درآمد و صد البته پر تقاضا در شرایط فعلی است که میتواند حتی زندگی افرادی که با آن درگیر هستند را به طور کامل تغییر دهد، اما برای شروع برنامه نویسی باید چیکار کرد؟ کدام زبان برنامه نویسی برای شروع بهتر هستند؟ در واقع باید بگوییم بهتر یا بهترین وجود ندارد، زبانهای برنامهنویسی هرکدام در حیطه کار خود میتوانند بهترین گزینه برای شروع برنامهنویسی باشند اما میتوان گفت در این بین بعضی از زبانهای برنامهنویسی به علت ماهیت خود میتوانند مناسبتر برای شروع باشند که در ادامه آنها را به طور کامل عنوان خواهیم کرد. در ادامه به بررسی بهترین زبان برنامه نویسی برای شروع خواهیم پرداخت.
HTML و CSS
HTML و CSS از نظر فنی جزو زبانهای برنامهنویسی نیستند، اما براساس نظرسنجی توسعهدهندگان Stack Overflow در سال 2022، این دو زبان رتبه اول ساده ترین زبان های برنامه نویسی برای شروع را گرفتهاند.
HTMLزبان html چیست؟ اچ تی ام ال (HTML) چیست و چه کاربردی دارد؟این مقاله عالی به معرفی زبان html پرداخته سپس موارد چون : html چه کاربردی دارد؟ فایل html چیست؟ بررسی مزایا و معایب HTML، پرکاربرد ترین تگ های HTML پرداخته و CSS زبان های نشانه گذاری هستند و از آنها برای ایجاد و توسعه صفحات وب استفاده میشود. این دو زبان برای افرادی که میخواهند برنامهنویسی فرانت اند (Front-end) را یاد بگیرند، برای شروع مناسب است. زبان نشانهگذاری HTML که مخفف HyperText Markup Language است، ساختار و محتوای یک صفحه وب را تعریف میکند. CSS نیز مخفف عبارت Cascading Style Sheets است و عناصر HTML را بصریتر میکند. (کد CSS تمام رنگها و فونتهای مختلف را فعال میکند.)
جاوا اسکریپت (JavaScript)
طبق آخرین نظرسنجیها بین برنامهنویسان Stack Overflow زبان برنامه نویسی جاوا اسکریپتجاوا اسکریپت چیست؟ معرفی زبان برنامه نویسی java scriptزبان برنامه نویسی جاوا اسکریپت چیست و چه کاربردی دارد؟ این صفحه عالی به بررسی مزایای JavaScript پرداخته و مبانی برنامه نویسی جاوا اسکریپت را آموزش داده دومین رتبه از بهترین زبانهای برنامهنویسی برای شروع را دریافت میکند. این زبان برنامه نویسی در کنار زبانهای قبلی استفاده میشود و به برنامهنویسان اجازه میدهد که صفحات وبسایت را تعاملیتر کنند.
برخی از ویژگیهای تعاملی که جاوا اسکریپت میتواند به سایت اضافه کند عبارتند از:
- نقشهای با مکان فعلی کاربر
- پیامی که پس از ورود به صفحه به کاربر نشان داده میشود
- تغییر در صفحه بر اساس ورودی کاربر
- یک انیمیشن زمانی که کاربر روی دکمهای کلیک میکند
- جلوههای ماوس اور (Mouse Over)
جاوا اسکریپت در درجه اول برای برنامه نویسی سمت کلاینت و اسکریپت سمت سرور استفاده میشود و همچنین برای استفاده از آن نیاز به یک نرم افزار خاص نیست که کامپایل کند، بلکه در مرورگر نیز اجرا میشود.
ویژگی ها | |
نوع | High-level |
---|---|
مهارت های مورد نیاز | مهارت های کد نویسی ابتدایی،HTML و CSS |
بهترین انتخاب برای | سطح مبتدی تا متوسط |
محبوبیت | مورد علاقه 58.3% کاربران و جزء 10 زبان محبوب در نظرسنجی های مختلف StackOverFlow |
مزایا |
|
معایب | ممکن است توسط مرورگر های مختلف متفاوت تفسیر شود که این امر برنامه نویسی cross-browser را دشوار میکند. |
موارد استفاده |
|
پایتون (Python)
پایتون یکی از محبوب ترین زبان های برنامه نویسی ۲۰۲۳معرفی محبوب ترین زبان های برنامه نویسی ۲۰۲۳این صفحه فوق العاده به معرفی محبوب ترین زبان های برنامه نویسی ۲۰۲۳ پرداخته. همچنین در هر یک از این زبانها به معرفی بهترین پلتفرم آن، فریم ورک های برتر آن و بهترین کتابخانه های آن پرداخته است و برنامهنویسان زیادی آن را از بهترین زبان های برنامه نویسی برای شروع میدانند. پایتون یک سینتکس ساده دارد، جزئیات بسیار کمی دارد، زبان آن بسیار نزدیک به زبان انسان است، کاربردهای زیادی دارد و برنامهنویس را بیش از حد درگیر نمیکند به همین دلیل بسیار مبتدی پسند است. پیشنهاد ما این است که اگر به دنبال بهترین زبان برنامه نویسی برای شروع هستید زبان برنامه نویسی پایتون میتواند یک گزینه عالی باشد.
همچنین زبان برنامه نویسی پایتون با داشتن فریمورک های جذابی مانند جنگو (Django) و فلاسک (Flask) میتواند کارهایی مانند توسعه سمت سرور وبسایت ، تجزیه و تحلیل دادهها، یادگیری ماشینیادگیری ماشین چیست و چرا مهم است؟ - Machine learning (ML)تعریف یادگیری ماشین : ماشین لرنینگ (Machine Learning یا به اختصار ML) باعث میشود که خود ماشینها با آنالیز داده ها امکان یادگیری و پیشرفت داشته باشند، یادگیری عمیقیادگیری عمیق چیست؟ معرفی کامل یادگیری عمیق به زبان سادهاین مقاله به سوالات رو به رو پاسخ داده : یادگیری عمیق چیست و چگونه کار میکند؟ آیا یادگیری عمیق همان شبکه عصبی است؟ تفاوت یادگیری عمیق با یادگیری ماشین چیست؟ و توسعه برنامههای کاربردی را بیش از پیش ساده و روان کند.
ویژگی ها | |
نوع | High-level |
---|---|
مهارت های مورد نیاز |
|
بهترین انتخاب برای | مبتدی تا متوسط |
محبوبیت | جزء 5 زبان محبوب در نظرسنجی های مختلف و دارای محبوبیت روزافزون |
مزایا |
|
معایب |
|
موارد استفاده |
|
جاوا (Java)
جاواجاوا چیست؟ تعریف، معنی و ویژگی های جاوا (java) از 0تا100جاوا یک زبان برنامه نویسی همه منظوره، مبتنی بر کلاس و شی گرا است که برای داشتن وابستگی های پیاده سازی کمتر طراحی شده است، زبان برنامه نویسی جاوا شبیه ++C است نیز یکی از بهترین زبانهای برنامهنویسی برای شروع به شمار میرود زیرا یک زبان برنامه نویسی شئ گرا و همه منظوره است که سینتکس آن بر اساس زبان های برنامه نویسی C و زبان C++برنامه نویسی سی پلاس پلاس چیست؟ مزایای برنامه نویسی C++؟برنامه نویسی سی پلاس پلاس چیست و چه کاربردی دارد؟ این صفحه عالی به بررسی مزایای برنامه نویسی C++ پرداخته و نمونه هایی از کدهای زبان برنامه نویسی ++C را آورده است، یکی از مزیتهای اصلی این زبان قابل حمل بودن آن است (یعنی یک برنامه را روی یک سیستمعامل مثل ویندوز بنویسیم و بعد بر روی انواع سیستمعاملها مانند لینوکس، مک و غیره به راحتی اجرا شود.)
توجه داشته باشید زبان برنامه نویسی جاوا با جاوا اسکریپت اصلاً یکسان نیست. جاوا اسکریپت یک زبان برنامه نویسی تفسیر شده است که در مرورگر اجرا میشود و نیازی به کامپایل ندارد اما جاوا ترکیبی از یک کامپایلر (Compiler)کامپایلر چیست و چگونه کار میکند و چرا از آن استفاده میشود؟کامپایلر (Compiler) یک برنامهی خاص برای ترجمه سورس کدهای (Source Code) یک زبان برنامه نویسی، به زبان ماشین یا بایت کد و یا یک زبان برنامه نویسی دیگر است و یک مفسر را استفاده میکند و روی ماشینها اجرا میشود، نه در مرورگرها.
ویژگی ها | |
نوع | High-level |
---|---|
مهارت های مورد نیاز |
|
بهترین انتخاب برای | سطح مبتدی تا متوسط |
محبوبیت | یکی از محبوب ترین و پرتقاضا ترین زبان های برنامه نویسی دنیا |
مزایا |
|
معایب |
|
موارد استفاده |
|
سی شارپ (#C)
سی شارپ یک زبان برنامه نویسی شئ گرا است و دقیقاً همین شئ گرا بودن آن میتواند یادگیری سادهتری را برای شروع به همراه داشته باشد. این زبان برنامه نویسیبرنامه نویسی کامپیوتر چیست و چطور می توانید یک برنامه نویس موفق شوید؟در عصر فعلی برنامهنویسی یکی از پرطرفدارترین شغلهای دنیاست، دغدغهای افرادی که میخواهند در مسیر برنامهنویس شدن قدم بردارند این است که نمیدانند از کجا باید شروع کنند، در این صفحه هر آن چه برای تبدیل شدن به یک برنامه نویس حرفه ای نیاز دارید در اختیارتان قرار گرفته است در ابتدا به عنوان زبان مایکروسافت و برای فریمورک دات نت توسعه یافت اما اکنون با انواع سیستمعاملها از جمله لینوکس و ویندوز کاملاً سازگار است.
با یادگیری این زبان برنامهنویسی، برنامهنویسان میتوانند اپلیکشن اندرویدسیستم عامل اندرويد چیست؟ هر آنچه باید درمورد Android بدانیداندروید چیست و چه ویژگی هایی دارد؟ این مقاله عالی به معرفی سیستم عامل اندروید (Android)، تاریخچه و توسعه اندروید، ویژگی های ورژن های مختلف اندروید پرداخته است یا iOSسیستم عامل iOS چیست؟ بررسی تاریخچه و ویژگی های آی او اساین مقاله عالی به معرفی سیستم عامل آی او اس (IOS) پرداخته، همچنین به بررسی ویژگی های سیستم عامل Apple iOS و تاریخچه و نسخه های سیستم عامل iOS پرداخته است بسازند، همچنین آنها میتوانند برنامههای کاربردی دسکتاپ توسعه دهند یا بازیهای جذاب دو بعدی و سه بعدی با استفاده از فریمورک یونیتی بسازند.
سی شارپ یکی از پر تقاضا ترین زبان های برنامه نویسی سال 2023 است و به بیشتر افرادی که به دنبال بهترین زبان برنامه نویسی برای شروع میگردد پیشنهاد میشود تا سی شارپ را یاد بگیرند، این زبان شاید یادگیری سختتری نسبت به پایتون یا اچ تی ام ال داشته باشد اما کاربردهای جذابی دارد.
ویژگی ها | |
نوع | High-level |
---|---|
مهارت های مورد نیاز | آشنایی با زبان C و برنامه نویسی شی گرا |
بهترین انتخاب برای | سطح مبتدی و متوسط |
محبوبیت | نسبتا محبوب اما نه به اندازه جاوا |
مزایا |
|
معایب |
|
موارد استفاده |
|
سی پلاس پلاس (++C)
++C نسخه پیشرفته C و یکی از محبوب ترین زبان های برنامه نویسی در علوم کامپیوتر است، این زبان برنامهنویسی شاید زبان برنامهنویسی سادهای برای شروع نباشد و حتی یادگیری سختی نسبت به سایر زبانهای برنامهنویسی داشته باشد، چون زبان آن بسیار نزدیک به زبان ماشین است، اما ماهیت سریع و قدرتمند آن به توسعهدهندگان اجازه میدهد برنامههایی با عملکرد عالی مانند بازیهای ویدیویی، نرم افزارهای گرافیکی و مرورگرهای وب ایجاد کنند.
ترکیب زبان سطح بالا و سطح پایین در سی پلاس پلاس آن را برای توسعه سیستم عامل قدرتمند می سازد. همچنین، زبان C++برنامه نویسی سی پلاس پلاس چیست؟ مزایای برنامه نویسی C++؟برنامه نویسی سی پلاس پلاس چیست و چه کاربردی دارد؟ این صفحه عالی به بررسی مزایای برنامه نویسی C++ پرداخته و نمونه هایی از کدهای زبان برنامه نویسی ++C را آورده یک زبان برنامهنویسی چند پارادایم است که از برنامه نویسی OOP، عمومی و ضروری پشتیبانی میکند.
ویژگی ها | |
نوع | Mid-level |
---|---|
مهارت های مورد نیاز |
|
مناسب برای | کدنویس های با تجربه |
محبوبیت | یکی از محبوب ترین زبان های برنامه نویسی |
مزایا |
|
معایب |
|
موارد استفاده |
|
PHP
PHP یکی از اولین زبانهای بکاند است که بسیاری از توسعهدهندگان وب این زبان را یکی از بهترین زبان های برای شروع کد نویسی میدانند، علاوه بر این، PHP توسط 78.1% از تمام وبسایتها استفاده میشود زیرا این زبان، زبان اصلی وردپرس است.
زبان PHP برای شروع برنامهنویسی یکی از زبانهای ساده به شمار میرود زبرا علاوه بر داشتن منبع گسترده یادگیری، سینتکس آن بسیار راحت و ابتدایی است. PHP علیرغم اینکه یکی از قدیمی ترین زبانهای برنامهنویسی در صنعت برنامهنویسی است، یک زبان برنامهنویسی متن باز (Open Source)اوپن سورس یا متن باز چیست؟ اوپن سورس به چه معناست؟اوپن سورس یا متن باز چیست؟ این صفحه عالی به بررسی این موارد و همچنین تاریخچه نرم افزار متن باز و نحوه به کارگیری متن باز در توسعه نرم افزار پرداخته است و بسیار مورد تقاضا است، برنامهنویسان PHP میتوانند از این زبان برای نوشتن اسکریپتهای خط فرمان و همچنین اسکریپتهای سمت سرور و توسعه برنامههای دسکتاپ استفاده کنند.
ویژگی ها | |
نوع | High-level |
---|---|
مهارت های مفید |
|
مناسب برای | مبتدی ها |
محبوبیت | تقریبا 80% وبسایت های فعال از این زبان استفاده میکنند. پس میتوان نتیجه گرفت در میان برنامه نویسان وب، محبوبیت بالایی دارد |
مزایا |
|
معایب |
|
موارد استفاده |
|
سوئیفت (Swift)
سوئیفت یکی از جدیدترین زبان های برنامه نویسی در بازار امروز است، این زبان برنامه نویسی در ابتدا با هدف اینکه جایگزین زبان Objective-C بشود طراحی شد. سوئیفت بدون شک بهترین زبان برنامهنویسی در توسعه محصولات اپل و یکی از سریعترین زبانهای برنامهنویسی در دسترس است.
این زبان برنامه نویسی، بهترین زبان برنامهنویسی برای شروع به شمار میرود، زیرا توسعهدهندگان کمی دارد و بازار کار زیادی برای برنامهنویسان میتواند فراهم کند، همچنین برنامه نویسی با سوئیفت حافظهحافظه در کامپیوتر، همه چیز در مورد حافظه در معماری کامپیوتردر این مقاله به بررسی کامل حافظه در کامپیوتر، انواع حافظه در کامپیوتر، کش، روشهای آدرس دهی کش، نگاشت آدرس و موارد دیگر میپردازیم کمی از کامپیوتر میگیرد و با آن میتوان به مراتب کدهای تمیزتری زد.
ویژگی ها | |
نوع | Low-level |
---|---|
مهارت های مورد نیاز | - |
بهترین انتخاب برای | سطح مبتدی تا متوسط |
محبوبیت | در حال کسب محبوبیت، از جمله در میان برنامه نویسان iOS |
مزایا |
|
معایب |
|
موارد استفاده |
|
Go
Go یا Golang برای توسعه APIAPI چیست؟ همه چیز درباره api یا رابط برنامه نویسی کاربردیاین مقاله عالی بررسی کرده که API چیست و چه کاربردی دارد و چگونه می توان از api ها در برنامه های خود استفاده نمود. همچنین استاندارد api و کاربرد api بررسی شده ها، برنامههای دسکتاپ مبتنی بر رابط کاربری گرافیکی و برنامههای کاربردی وب ایجاد شده است. این زبان برنامهنویسی با اینکه تازه کار است اما سریعاً در حال رشد است. برنامه نویسی همزمان یکی از بهترین ویژگیهای Go است زیرا برنامهنویسان را قادر میسازد تا با پردازنده (CPU)پردازنده (CPU) چیست؟ بررسی انواع، وظایف و کاربردهاسی پی یو قلب کامپیوتر و کامپیوتر قلب دنیای کنونی است، بنابراین در این صفحه به معرفی و بررسی سیپییو یا همان پردازنده مرکزی (CPU) پرداخته شده، و بطور کامل توضیح دادهایم که CPU از چه بخش هایی تشکیل شده و هر بخش چه وظایف و مشخصاتی دارد. های چند هستهای و یک پایگاه کد عظیم کار کنند. همچنین، توسعهدهندگان Go حقوق بالایی داشته و تقاضای بیشتری نسبت به سالهای قبل دارند.
ویژگی ها | |
نوع | High-level |
---|---|
مهارت های مورد نیاز | اگر یک زبان برنامه نویسی دیگر بلد باشید، یادگیری این زبان برایتان ساده تر است. در غیر این صورت نیاز به تمرین و اشتیاق برای یادگیری دارید. |
بهترین انتخاب برای | سطح مبتدی تا متوسط |
محبوبیت | به اندازه ی جاوا یا پایتون محبوب نیست اما، محبوبیت آن در حال افزایش است. |
مزایا |
|
معایب |
|
موارد استفاده |
|
SQL
اگر به علم داده و محاسبات آماری علاقه دارید، زبان پرس و جوی ساختاریافته (SQL) بهترین زبان برنامهنویسی برای یادگیری است. به برنامهنویسان اجازه میدهد دادههای ذخیره شده در یک پایگاه داده رابطهای را جستجو، دستکاری و تجزیه و تحلیل کنند. SQL سومین زبان پرکاربرد بر اساس آمار Stack Overflow است، از نظر فرصتهای شغلی، تقریباً همه شرکتها ممکن است به توسعهدهندگان SQL نیاز داشته باشند، زیرا آنها نقشی حیاتی در مدیریت پایگاه داده ایفا میکنند. اما چرا SQL یکی از بهترین زبان ها برای شروع است؟ زیرا، یادگیری SQL بسیار آسان است و نحو آن از کلمات رایج انگلیسی استفاده میکند.
مزایا :
- پردازش سریع پرس و جو(Query)
- قابل حمل
- امنیت بالا
- بسیار تعاملی
- جامعه کاربران وسیع
معایب
- Open-source نبودن
- نامناسب برای ساخت Application
جمع بندی
- در برنامهنویسی سمت کاربر، جاوا اسکریپتجاوا اسکریپت چیست؟ معرفی زبان برنامه نویسی java scriptزبان برنامه نویسی جاوا اسکریپت چیست و چه کاربردی دارد؟ این صفحه عالی به بررسی مزایای JavaScript پرداخته و مبانی برنامه نویسی جاوا اسکریپت را آموزش داده بهترین زبان برنامه نویسی برای توسعه فرانت اند است.
- در برنامهنویسی سمت سرور، پایتون، پیاچپی و گو بهترین زبان های برنامه نویسی سمت سرور هستند.
- سی شارپ، جاوا اسکریپت، جاواجاوا چیست؟ تعریف، معنی و ویژگی های جاوا (java) از 0تا100جاوا یک زبان برنامه نویسی همه منظوره، مبتنی بر کلاس و شی گرا است که برای داشتن وابستگی های پیاده سازی کمتر طراحی شده است، زبان برنامه نویسی جاوا شبیه ++C است و گو از جمله بهترین زبانهای برنامهنویسی برای ساخت اپلیکیشنهای وب هستند.
- SQL بهترین زبان برای مدیریت پایگاه داده است.
- C++، JavaScript و Java زبانهای برنامهنویسی قدرتمندی برای توسعه و طراحی بازی هستند.
- زبان C++برنامه نویسی سی پلاس پلاس چیست؟ مزایای برنامه نویسی C++؟برنامه نویسی سی پلاس پلاس چیست و چه کاربردی دارد؟ این صفحه عالی به بررسی مزایای برنامه نویسی C++ پرداخته و نمونه هایی از کدهای زبان برنامه نویسی ++C را آورده و جاوا بهترین زبانها برای توسعه اپلیکیشن موبایل هستند.
- Swift بهترین زبان برنامهنویسی برای توسعه برنامههای iOSسیستم عامل iOS چیست؟ بررسی تاریخچه و ویژگی های آی او اساین مقاله عالی به معرفی سیستم عامل آی او اس (IOS) پرداخته، همچنین به بررسی ویژگی های سیستم عامل Apple iOS و تاریخچه و نسخه های سیستم عامل iOS پرداخته است است.
- Python و SQL برای محاسبات آماری و پردازش دادهها عالی هستند.
در آخر امیدواریم این مقاله به شما در مورد تصمیم گیری بهترین زبان برنامه نویسی برای شروع کمک کرده باشد، برای دیدن مقالات جذابتر میتواند از بلاگ کنکور کامپیوتر دیدن کنید، همچنین منتظر نظرات و پیشنهادات شما در انتهای همین نوشتار هستیم.
مقالاتی که احتمالا برای شما جذاب است :
- زبان برنامه نویسی C زبان برنامه نویسی C – مزایا و کاربرد زبان C – فرق C و ++Cاین مقاله عالی ابتدا توضیح میدهد که زبان برنامه نویسی c چیست، سپس به بررسی مزایا و معایب زبان C ، کاربردهای زبان سی ، و تفاوت بین C و ++C میپردازد
- زبان برنامه نویسی Rزبان برنامه نویسی R چیست؟ کاربرد زبان برنامه نویسی r چیست؟این مقاله عالی به توضیح زبان برنامه نویسی R (آر) پرداخته، همچنین به بررسی محیط نرم افزاری زبان R، مزایا و معایب زبان R و کاربردهای زبان R پرداخته است
- چه زبان های برنامه نویسی در دانشگاه تدریس می شودچه زبان های برنامه نویسی در دانشگاه تدریس می شوداین صفحه عالی به بررسی این موضوع پرداخته که در دانشگاه های ایران چه زبان برنامه نویسی ای آموزش داده می شود؟
- محبوب ترین زبان های برنامه نویسیمعرفی محبوب ترین زبان های برنامه نویسی ۲۰۲۳این صفحه فوق العاده به معرفی محبوب ترین زبان های برنامه نویسی ۲۰۲۳ پرداخته. همچنین در هر یک از این زبانها به معرفی بهترین پلتفرم آن، فریم ورک های برتر آن و بهترین کتابخانه های آن پرداخته
بهترین زبان برنامه نویسی برای مبتدیان کدام است؟
HTML که مخفف HyperText Markup Language است، یکی از رایجترین زبان های برنامه نویسی برای مبتدیان است، زیرا اغلب به عنوان سادهترین زبان برنامهنویسی برای یادگیری دیده میشود. جاوا اسکریپت، پایتون، سی شارپ و جاوا نیز جزو بهترین زبانهای برنامهنویسی برای مبتدیان است.
آیا یادگیری پایتون سخت است؟
خیر، اصلاً اینگونه نیست، بلکه پایتون یکی از ساده ترین زبان های برنامه نویسی برای یادگیری درنظر گرفته میشود. هرکسی میتواند برنامهنویسی پایتون را به راحتی یاد بگیرد، حتی کسی که کوچکترین دانش کدنویسی را ندارد.
آیا یادگیری برنامه نویسی سخت است؟
جواب این سؤال نه بله است و نه خیر، بسیاری یادگیری برنامه نویسی را جذاب میدانند و یکی از بهترین برنامهنویسان میشوند و بسیاری یادگیری آن را سخت میدانند و در نیمه یادگیری آن را رها میکنند. بستگی به دانش فردی و علایق ذاتی دارد که آیا یادگیری برنامهنویسی سخت یا آسان باشد.
آیا می توان به تنهایی یادگیری برنامه نویسی را شروع کرد؟
میتوان برنامهنویسی را به تنهایی شروع کرد، اما توجه داشته باشید این کار قطعاً آسان نخواهد بود و باید منابع درستی برای یادگیری انتخاب کرد، بهترین منابع برای یادگیری آموزشهای آنلاین است که در سر تا سر وب مشاهده میشود.
آیا زبان ++C زبان برنامه نویسی مناسبی برای شروع است؟
++C یک زبان نزدیک به زبان ماشین است که یادگیری سختی دارد، اما کاربردهای زیادی دارد. این زبان برنامهنویسی به آن دسته از افرادی پیشنهاد میشود که قبلاً یا آشنایی با برنامه نویسی داشتهاند یا حداقل یک زبان برنامهنویسی یاد گرفتهاند.
به طور خلاصه به مسائل مرتبط با یادگیری، پیش بینی و انجام کار هوشمندانه توسط کامپیوتر هوش مصنوعی (Artificial intelligence) گفته میشود. در صفحه هوش مصنوعیهوش مصنوعی (AI) چیست؟ انواع، کاربردها، مزایا و معایبهوش مصنوعی یا Artificial Intelligence یا به اختصار AI، امروزه کاربردهای بسیاری پیدا کرده و به یکی از داغترین حوزههای بشر تبدیل شده است، اما با این وجود بسیاری از افراد با کاربردهای آن آشنایی کامل ندارند، به همین علت در این صفحه کاربردها، مزایا و معایب AI بطور کامل بررسی شده است میتوانید توضیحات جامعی درباره هوش مصنوعی و جنبههای مختلف آن مطالعه کنید.
کاربرد هوش مصنوعی در صنعت پزشکی
بطور کلی فناوریهای هوش مصنوعی (AI) در تجارت مدرن، زندگی روزمره و حتی مراقبتهای بهداشتی به کار میروند. بکارگیری هوش مصنوعی در مراقبت های بهداشتی در بسیاری از جنبههای مراقبت از بیمار و فرآیندهای اداری به مراکز خدماتی مراقبتهای بهداشتی کمک کرده و راه حلهای موجود را بهبود بخشیده و بر چالشها غلبه میکند.
فناوریهای هوش مصنوعی و مراقبتهای بهداشتی و پزشکی با اکثر حوزه مراقبتهای بهداشتی ارتباط تنگاتنگی دارند، اما روش هایی که پشتیبانی میکنند به طور قابل توجهی بین بیمارستانها و سایر سازمانهای مراقبتهای بهداشتی متفاوت است. در حالی که برخی از مقالات نشان میدهند که استفاده از هوش مصنوعی در مراقبتهای بهداشتی میتواند در برخی از روشها مانند تشخیص بیماری به خوبی یا بهتر از انسان عمل کند، اما در واقعیت چند سالی طول خواهد کشید تا هوش مصنوعی در مراقبتهای بهداشتی جایگزین انسان شود.
در واقع هوش مصنوعی در پزشکی الگوریتمهایی هستند که با روشهای مبتنی بر یادگیری و پیش بینی، به مدلهایی برای تحلیل دادههای پزشکی و کشف بینشها برای کمک به بهبود نتایج سلامت و تجربیات بیمار دست پیدا میکنند. به لطف پیشرفتهای اخیر در علم کامپیوتر و انفورماتیک، هوش مصنوعی (AI) به بخشی جدایی ناپذیر از مراقبت های بهداشتی مدرن تبدیل شده است. امروزه بسیاری از پزشکان متخصص در محیطهای بالینی و یا آزمایشگاههای تحقیقاتی و پژوهشی از الگوریتم های هوش مصنوعی و سایر برنامههای کاربردی مرتبط با آنها استفاده میکنند. برای مطالعه بیشتر در خصوص ساختار الگوریتمها و آشنایی با انواع آنها میتوانید به مقاله الگوریتم چیستالگوریتم چیست به زبان ساده و با مثال های فراواندر این مقاله به زبان بسیار ساده و با مثال های متعدد توضیح داده شده که الگوریتم چیست و چه کاربردهایی دارد مراجعه نمایید.
در حال حاضر، رایج ترین نقشهای هوش مصنوعی در پزشکی، پشتیبانی تصمیم گیری بالینی و تجزیه و تحلیل تصاویر پزشکی است. ابزارهای پشتیبانی تصمیم بالینی با فراهم کردن دسترسی سریع به اطلاعات یا تحقیقات مرتبط با بیمار، درمانها، داروها، سلامت روان و سایر نیازهای بیمار به پزشکان در امر تشخیص و تصمیمگیری کمک میکنند. در تصویربرداری پزشکی، ابزارهای هوش مصنوعی برای تجزیه و تحلیل تصاویر سی تی اسکن، اشعه ایکس، ام آر آی (MRI) و سایر تصاویر به منظور یافتن و تشخیص ضایعات یا سایر یافتههایی است که شاید از نگاه یک رادیولوژیست انسانی مخفی مانده و با گذر زمان بیمار را دچار عارضههای شدیدتری کند.
انواع هوش مصنوعی مرتبط با مراقبت های بهداشتی
هوش مصنوعی مجموعهای از فناوریهاست که با حوزه مراقبتهای بهداشتی در ارتباط هستند اما دامنه پشتیبانی از فرآیندها و وظایف خاص در آنها بسیار متفاوت است. در ادامه به برخی از فناوریهای هوش مصنوعی که اهمیت بالایی در مراقبتهای بهداشتی دارند مورد بررسی قرار گرفته اند.
یادگیری ماشین - شبکه های عصبی و یادگیری عمیق
یادگیری ماشین (Machine Learning) یک تکنیک آماری برای تطبیق مدلها با دادهها و «یادگیری» با آموزش مدلها با داده است. یادگیری ماشین یکی از رایج ترین اشکال هوش مصنوعی است. این موضوع یک تکنیک گسترده در هسته بسیاری از رویکردهای هوش مصنوعی است و نسخههای زیادی از آن وجود دارد.
در مراقبتهای بهداشتی، رایجترین کاربرد یادگیری ماشین سنتی، "پزشکی دقیق" است، پیشبینی اینکه چه پروتکلهای درمانی احتمالاً بر اساس ویژگیهای مختلف بیمار و زمینه درمان موفق خواهند شد.
قسمت بزرگی از کاربردهای یادگیری ماشین و پزشکی دقیق نیاز به یک مجموعه داده آموزشی دارند که متغیر نتیجه آن (مثلاً شروع بیماری) شناخته شده باشد. این یادگیری تحت نظارت نامیده می شود.
شکل پیچیدهتر یادگیری ماشین، شبکه عصبی (Artificial Neural Networks) است. این فناوری با بهرهگیری از ساختار و خصوصیات گرافها در سال 1960 معرفی شد. این فناوری در چند دهه گذشته جایگاه خوبی را در تحقیقات مراقبتهای بهداشتی به دست آورده و برای مواردی همچون دسته بندی بیماریها و یا پاسخ به این سوال که آیا بیمار به بیماری خاصی مبتلا میشود یا خیر، استفاده میشود.
در شبکه عصبی از ساختمان دادهآموزش ساختمان داده و الگوریتمهر ساختمان داده یک نوع فرمت ذخیرهسازی و مدیریت دادهها در کامپیوتر است، که امکان دسترسی و اصلاح کارآمد آن دادهها را برای یکسری از الگوریتمها و کاربردها فراهم میکند، در این صفحه به بررسی و آموزش ساختمان داده و الگوریتم پرداخته شده است گراف برای ذخیره و آرایش دادههای ورودی و خروجی در قالب نودهای یک گراف بهره میگیرند و از طریق یالهای وزندار نودها را بر اساس ویژگیهایشان به یکدیگر مرتبط میکند. از آن جا که روش آن مشابه روشی است که نورونها، سیگنالها را پردازش می کنند، نام شبکه عصبی را به آن داده اند. اما در کل قیاس آن با عملکرد مغز کاری ساده لوحانه است. اگر علاقهمند به مطالعه بیشتر در خصوص گرافها و ساختار آنها هستید، لطفا به مقاله نظریه گراف مراجعه نمایید.
پیچیده ترین اشکال یادگیری ماشین شامل یادگیری عمیق (Deep Learning) یا مدل های شبکه عصبی (Artificial Neural Networks) با سطوح بسیاری از ویژگیها یا متغیرهایی است که نتایج را پیش بینی میکنند. ممکن است هزاران ویژگی پنهان در چنین مدلهایی وجود داشته باشد که با پردازش سریعتر واحدهای پردازش گرافیکی امروزی و معماریهای ابری آشکار میشوند.
یکی از کاربردهای رایج یادگیری عمیق در مراقبتهای بهداشتی، شناسایی تودههای بالقوه سرطانی در تصاویر رادیولوژی است. یادگیری عمیق به طور فزایندهای در مورد رادیومیکها یا تشخیص ویژگیهای مرتبط بالینی در دادههای تصویربرداری فراتر از آنچه که توسط چشم انسان قابل درک است، اعمال میشود. هم رادیومیک و هم یادگیری عمیق معمولاً در تجزیه و تحلیل تصویر انکولوژی (سرطان شناسی) یافت میشوند. توضیح آنکه رادیومیک عبارت است ازمتدهای مبتنی بر الگوریتمهای علوم دادهای که برای استخراج ویژگیها از تصاویر پزشکی مورد استفاده قرار میگیرند.
همانطور که ذکر شد یکی از انواع هوش مصنوعی در پزشکی تحلیل تصاویر پزشکی است که در عین حال خود این موضوع به نوعی زیر مجموعه پردازش تصویر است. برای مطالعه بیشتر پیرامون پردازش تصویر میتوانید به صفحه پردازش تصویرپردازش تصویر دیجیتال چیست؟ چه انواعی دارد؟ چه مراحلی را شامل میشود؟ پردازش تصویر یکی از فیلدهای پرطرفدار مرتبط با گرافیک کامپیوتر، بینایی کامپیوتر، هوش مصنوعی، یادگیری ماشین، و الگوریتمها و محاسبات است که ارتباط تنگاتنگی میان تمام آنهاست. در نتیجه در این صفحه علاوه بر معرفی این فیلد، نقشه راهی نیز برای علاقهمندان این حوزه ارائه کردهایم. رجوع نمایید.
به نظر میرسد ترکیب آنها نسبت به نسل قبلی ابزارهای خودکار برای تجزیه و تحلیل تصویر، که به عنوان تشخیص به کمک رایانه یا CAD شناخته میشود، دقت بیشتری را در تشخیص نوید میدهد. یادگیری عمیق نیز به طور فزایندهای برای تشخیص گفتار استفاده میشود و به این ترتیب، نوعی پردازش زبان طبیعی (NLP) است که در زیر توضیح داده شده است. برخلاف اشکال قبلی تجزیه و تحلیل آماری، هر ویژگی در یک مدل یادگیری عمیق معمولاً برای یک ناظر انسانی معنای کمی دارد. در نتیجه، تفسیر نتایج مدل ممکن است بسیار دشوار یا غیرممکن باشد.
پردازش زبان طبیعی
درک زبان انسان هدف محققان هوش مصنوعی از دهه 1950 بوده است. این رشته (NLP)، شامل برنامه هایی مانند تشخیص گفتار، تجزیه و تحلیل متن، ترجمه و سایر اهداف مرتبط با زبان است. دو رویکرد اساسی برای آن وجود دارد: NLP آماری و معنایی. NLP آماری مبتنی بر یادگیری ماشین (به ویژه شبکه های عصبی یادگیری عمیق) است و اخیراً دقت تشخیص را افزایش داده است. برای یادگیری به یک "پیکر" یا بدنه بزرگ زبان نیاز دارد.
در مراقبت های بهداشتی، کاربردهای غالب NLP شامل ایجاد، درک و طبقه بندی اسناد بالینی و تحقیقات منتشر شده است. سیستمهای NLP میتوانند یادداشتهای بالینی بدون ساختار روی بیماران را تجزیه و تحلیل کنند، گزارشهایی (مثلاً معاینات رادیولوژی) آماده کنند، تعاملات بیمار را رونویسی کنند، و هوش مصنوعی مکالمهای را انجام دهند.
سیستم های خبره مبتنی بر قانون
سیستمهای خبره مبتنی بر مجموعهای از قوانین «اگر-آنگاه» فناوری غالب برای هوش مصنوعی در دهه 1980 بودند و در آن دوره و دورههای بعدی به طور گسترده به صورت تجاری مورد استفاده قرار گرفتند. آنها به طور گستردهای در طول چند دهه گذشته در زمینه مراقبتهای بهداشتی و هدفهایی همچون “پشتیبانی از تصمیم گیری بالینی” به کار گرفته شدهاند و هنوز نیز در حال استفاده هستند. بسیاری از ارائه دهندگان پرونده الکترونیک سلامت (EHR) مجموعهای از این قوانین را همراه با سیستمهای خود ارائه میدهند..
سیستم های خبره به متخصصان انسانی و مهندسین دانش نیاز دارند تا مجموعه ای از قوانین را در یک حوزه دانش خاص بسازند.
آنها تا حدی به خوبی کار میکنند و به راحتی قابل درک هستند. با این حال، هنگامی که تعداد قوانین زیاد است (معمولاً بیش از چندین هزار) و قوانین شروع به تضاد با یکدیگر میکنند، تمایل به شکستن دارند. علاوه بر این، اگر حوزه دانش تغییر کند، تغییر قوانین میتواند دشوار و زمانبر باشد. آنها به آرامی در مراقبتهای بهداشتی با رویکردهای بیشتری بر اساس الگوریتم های داده و یادگیری ماشین جایگزین میشوند.
ربات های فیزیکی
ربات های فیزیکی با توجه به کاربرد رباتهای صنعتی در سراسر جهان به خوبی شناخته شدهاند. آنها وظایف از پیش تعریف شدهای مانند بلند کردن، جابجایی، جوشکاری، یا مونتاژ اشیاء را در مکانهایی مانند کارخانهها و انبارها و تحویل تجهیزات به بیمارستانها انجام میدهند. در سالهای اخیر روباتها با انسانها همکاری بیشتری داشته و با حرکت دادن آنها در کار مورد نظر، به راحتی آموزش داده میشوند.
با تعبیه سایر قابلیتهای هوش مصنوعی در "مغزشان" (در واقع سیستم عامل) آنها را باهوش ترو کاربردیتر میکنند. به نظر میرسد با گذشت زمان همان پیشرفتهای را که در سایر زمینههای هوش مصنوعی دیدهایم، در رباتهای فیزیکی نیز گنجانده شود.
برای اولین بار رباتهای جراحی در ایالات متحده آمریکا در سال 2000 بکار گرفته شدند و به مروز زمان قدرتهای فوقالعادهای را برای جراحان فراهم کردند و توانایی آنها را برای دیدن، ایجاد برشهای دقیق و کم تهاجمی، بخیه زدن زخمها و غیره بهبود بخشیدند اما همچنان تصمیمات مهم توسط جراحان انسانی گرفته میشود. جراحی زنان، جراحی پروستات و جراحی سر و گردن از جمله روشهای جراحی استاندارد با استفاده از جراحی رباتیک است.
اتوماسیون فرآیند رباتیک
این فناوری وظایف دیجیتالی ساختار یافته را برای مقاصد اداری انجام میدهد، یعنی کارهایی که شامل سیستمهای اطلاعاتی می شود، به گونهای که انگار یک کاربر انسانی هستند که از یک اسکریپت یا قوانین پیروی میکنند. این فناوری در مقایسه با سایر اشکال هوش مصنوعی، ارزانتر، قابلیت برنامهریزی آسان و شفافیت در عملکردشان هستند.
اتوماسیون فرآیند رباتیک یا همان (RPA) برعکس نام خود ارتباطی با رباتها نداشته د و فقط شامل برنامههایی رایانهای بر روی سرورهاست. RPA متکی بر ترکیبی از گردش کار، قوانین تجاری و یکپارچه سازی "لایه ارائه" با سیستمهای اطلاعاتی است تا مانند یک کاربر نیمه هوشمند در سیستمها عمل کند. در مراقبتهای بهداشتی، RPA ها برای کارهای تکراری مانند صدور مجوز، به روز رسانی سوابق بیمار یا صورتحساب استفاده میشوند.
هنگامی که با سایر فناوریها مانند تشخیص تصویر ترکیب میشوند، میتوان از آنها برای استخراج دادهها از تصاویر فکس شده استفاده کرد تا از آنها در سیستمهای تراکنشی استفاده کرد.
در این جا این فناوریها بهعنوان فناوریهای جداگانه توصیف شده اند، اما تمام این فناوریها بهطور فزایندهای در حال ترکیب و ادغام هستند. رباتها در حال دریافت «مغز» مبتنی بر هوش مصنوعی هستند و تشخیص تصویر با RPA ادغام میشود. شاید در آینده، این فناوریها چنان در هم آمیخته شوند که راهحلهای ترکیبی محتملتر یا امکانپذیرتر شوند و نهایتا به کاربردهای گسترده تر و دقیق تر بیانجامند.
کاربردهای هوش مصنوعی در سلامت
در بخشهای قبل چندین بار به واژههای کاربردهای هوش مصنوعی و کامپیوتر در خدمات پزشکی اشاره شد و در این بخش به طور ویژه به توضیح این کاربردها پرداختهایم. به طور کلی کاربرد هوش مصنوعی در بهداشت و درمان به چند دسته تقسیم میشود که به ترتیب در مورد هر یک توضیحاتی آورده شده است.
- تشخیص بیماری ها
- درمان بیماری ها
- درمان رفتاری
- درمان دارویی
- درمان به وسیله عمل جراحی
- نظارت های درمانی
همانطور که پیش تر نیز ذکر شد، یکی از راههای تشخیص بیماریها، تحلیل تصاویر پزشکی هستند که با استفاده از امکانات فناوری هوش مصنوعی با دقت بیشتر و صرف هزینه کمتر تصاویر را تحلیل میکنند. روش دیگر تشخیص بیماری توسط هوش مصنوعی استفاده از دادههای ژنتیکی و تحلیل آنهاست.
با گرفتن نمونه خون و استخراج دی ان ای (DNA) یک فرد میتوان به تفاوتهای ژنتیکی یک فرد با یک دی ان ای مرجع که از یک فرد سالم تهیه شده است، پی برد و در نهایت وجود بیماری را تشخیص داد. همچنین تحلیل داده های حیاتی یک فرد میتواند دید و تقریب خوبی از وضعیت سلامتی آن فرد به یک متخصص بدهد که این کار نیز به وسیله هوش مصنوعی ساده تر و کم هزینه تر میشود.
درمان یک بیماری را میتوان به سه بخش کلی تقسیم نمود، درمان رفتاری، درمان دارویی، درمان به وسیله عمل جراحی. در تمام این سه بخش میتوان هوش مصنوعی را بکار گرفت و با استفاده و بهره وری از امکاناتی که در اختیار انسان میگذارد، بیماریها را درمان کرد و یا حداقل در درمان بیماری تاثیر مثبت گذاشت. هر یک از سه بخش نام برده شده، دارای رشته دانشگاهی هستند و بحث پیرامونشان بسیار وسیع است. در زیر به توضیحاتی مختصر پیرامون هر یک کفایت شده است.
درمان رفتاری که گفتار درمانی یکی از زیر بخشهای آن است، نوعی درمان است که نیروی متخصص سعی میکند تا با مکالمه با فرد بیمار و تجویز الگوهای رفتاری خاص، منجر به بازگشت سلامت فرد بیمار شود. هوش مصنوعی میتواند با استفاده از یک سری قانون پیشفرض که نشات گرفته از علوم تجربی هستند و به کارگیری دادههای مربوط به درمانهای موفق و ناموفق این حوزه، به جای یک نیروی متخصص عمل کرده و در درمان بیمار موثر باشد.
درمان دارویی به دو بخش تجویز دارو مناسب و ساخت و توسعه داروها تقسیم میشود. در حال حاضر اثر و ردپای هوش مصنوعی را در هر دو این بخشها میتوان مشاهده نمود. در بخش تجویز، الگوریتمهای هوش مصنوعی با آنالیز پایگاه دادهای منسجم و قوی که شامل دادههای علمی یا نظری و داده های تجربی است وارد مرحله یادگیری شوند و پس از یادگرفتن پایگاه داده از الگوریتم هوش مصنوعی انتظار میرود با دقت خوبی پیشنهادات دارویی مناسبی به بیمار ارائه بدهد.
در بخش ساخت و توسعه دارو نیز هوش مصنوعی پیشرفتهای چشمگیری داشته و به وضوح میتوان مشاهده کرد که در آیندهای نزدیک به کمک این فناوری شاهد انقلابی عظیم در صنعت داروسازی باشیم. در این روش هوشمندسازی، با استفاده از مدل سازی مولکولها و پروتئینها به وسیله هوش مصنوعی سعی میشود تا داروی مناسب بیماریها، با توجه به اثرات مولکولی و ساختاریشان توسعه یافته و بدین وسیله درمان اتفاق بیافتد.
یکی از راههای نوین مدل سازی مولکولها توسط کامپیوتر، استفاده از گرافهای وزن دار است که میتوانند داده های مورد نیاز برای شبکه های عصبی گرافی و یادگیری آنها را تامین نمایند.
با رشد فناوریهای ساخت رباتهای پیشرفته، انجام کامل و یا کمک در انجام یک عمل جراحی توسط ربات ها به یک رویای دست یافته تبدیل شده و اکنون رباتها به صورت قابل توجهی در مقاصد جراحی مورد استفاده قرار میگیرند.
مطلع بودن پیوسته از حال عمومی بیمار و چک کردن علائم حیاتی فرد، همواره نقش به سزایی در درمان و بهبود حال یک بیمار بازی میکند و به کمک هوش مصنوعی و فناوریهای کامپیوتری این اتفاق در حال رخ دادن است و تحلیل علائم حیاتی و دادن مشورت به پزشکان از جمله وظایفی است که فناوریهای هوش مصنوعی موجود در صنعت پزشکی، بر دوش خود حس میکنند.
مزایا و معایب هوش مصنوعی در پزشکی
شرکتهای بزرگ فناوری در حال سرمایه گذاری بیشتر در نوآوریهای مراقبت های بهداشتی هوش مصنوعی هستند. به عنوان مثال، مایکروسافت یک برنامه پنج ساله 40 میلیون دلاری در سال 2020 برای رسیدگی به چالشهای مراقبتهای بهداشتی اعلام کرد. اگرچه هوش مصنوعی بدون شک صنعت مراقبتهای بهداشتی را تغییر میدهد، این فناوری هنوز نسبتاً جدید است. همانطور که پذیرش هوش مصنوعی در سراسر بخش مراقبتهای بهداشتی گسترش مییابد، سؤالات در مورد مزایا و محدودیتهای این فناوری بیش از پیش مهم میشوند.
مزایا استفاده از هوش مصنوعی در پزشکی
- فراهم نمودن داده های بلادرنگ (Real-time)
- ساده سازی وظایف
- ذخیره سازی زمان و منابع
- کمک کردن به تحقیقات
- کاهش استرس کادر درمان
یکی از اجزای حیاتی تشخیص و رسیدگی به مسائل پزشکی، کسب اطلاعات دقیق به موقع است. با هوش مصنوعی، پزشکان و سایر متخصصان پزشکی میتوانند از داده های فوری و دقیق برای تسریع و بهینه سازی تصمیم گیری بالینی حیاتی استفاده کنند. ایجاد نتایج سریعتر و واقعی تر میتواند منجر به بهبود مراحل پیشگیرانه، صرفه جویی در هزینه و زمان انتظار بیمار شود.
تجزیه و تحلیل دادههای بلادرنگ میتواند به بهبود روابط پزشک و بیمار کمک کند. اشتراک و در دسترس قرار دادن دادههای حیاتی بیمار از طریق دستگاههای تلفن همراه در طول فرآیند درمان، بیماران را با روند درمان و تغییرات حاصل شده آشنا میکند و موجب مشارکت بیمار و پزشک در طول دوره درمان میشود. هشدارهای تلفن همراه میتوانند پزشکان و پرستاران را از تغییرات فوری در وضعیت بیمار و شرایط اضطراری مطلع کنند.
هوش مصنوعی در پزشکی در حال حاضر شیوههای مراقبتهای بهداشتی را در همه جا تغییر داده است. نوآوریها شامل برنامهریزی قرار ملاقات، ترجمه جزئیات بالینی و ردیابی تاریخچه بیمار است. با بکارگیری امکانات هوش مصنوعی در مراقبتهای بهداشتی میتوان انجام وظایف خسته کننده و دقیق را ساده تر کرد.
به عنوان مثال، فناوری رادیولوژی هوشمند قادر است نشانگرهای بصری قابل توجهی را شناسایی کند و دیگر لازم به صرف ساعات زیادی برای برای تجزیه و تحلیل تصاویر نباشد. سیستمهای خودکار دیگری برای خودکار کردن زمانبندی قرار ملاقات، ردیابی بیمار و توصیههای مراقبت وجود دارند.
یکی دیگر از وظایف خاصی که با هوش مصنوعی ساده شده است، بررسی درست بودن بیمه است. هوش مصنوعی برای به حداقل رساندن هزینههای ناشی از رد ادعای بیمه استفاده میشود. با هوش مصنوعی، ارائه دهندگان سلامت میتوانند ادعاهای اشتباهی را که منجر به رد شدن درخواست پرداخت توسط شرکت های بیمه میشود را شناسایی و رسیدگی کنند. این کار نه تنها روند رسیدگی به ادعاهای مربوط به بیمه را ساده میکند، بلکه هوش مصنوعی باعث میشود تا در زمان کارمندان بیمارستان برای رسیدگی به درخواست ها و ارسال مجدد آن ها صرفه جویی شود.
با خودکار شدن فرآیندهای حیاتی، متخصصان پزشکی زمان بیشتری برای ارزیابی بیماران و تشخیص بیماریها دارند. یکی از کاربردهای هوش مصنوعی در پزشکی سرعت دادن به عملیات پزشکی و صرفه جویی در ساعات بهره وری ارزشمند مؤسسات پزشکی و درمانی است. در مراکز و موسسات درمانی برای هر ثانیه و دقیقه هزینههای زیادی صرف میگردد، بنابراین هوش مصنوعی پتانسیل صرفه جویی در هزینه های سنگین را هم دارد.
هوش مصنوعی محققان را قادر میسازد تا حجم زیادی از دادهها را از منابع مختلف جمع آوری کنند. توانایی استفاده از یک بدنه اطلاعاتی غنی و در حال رشد امکان تجزیه و تحلیل موثرتر بیماریهای لاعلاج و ناشناخته را فراهم میکند. در ارتباط با دادههای بلادرنگ، تحقیقات میتوانند از مجموعه وسیعی از اطلاعات موجود بهره ببرند، البته با این شرط که اطلاعات به راحتی قابل ترجمه و بازیابی باشند.
نهادهای تحقیقاتی پزشکی مانند آزمایشگاه دادههای سرطان کودکان در حال توسعه نرمافزار مفیدی برای پزشکان هستند تا بتوانند مجموعههای گستردهای از دادهها را بهتر هدایت کنند. هوش مصنوعی همچنین برای ارزیابی و تشخیص سریعتر علائم در پیشرفت بیماری استفاده شده و راهحلهای ((بهداشت از راه دور)) برای پیگیری پیشرفت بهبود بیمار، بازیابی دادههای تشخیصی حیاتی و ارائه اطلاعات جمعیت بیماران به شبکههای مشترک که به منظور هم افزایی ایجاد شده اند؛ بکار میروند.
برخی از آخرین تحقیقات گزارش میدهند که بیش از نیمی از پزشکان از فشارهای ضرب الاجل و فوری برای نجات جان بیماران و سایر شرایط محل کار احساس استرس میکنند. هوش مصنوعی به سادهسازی رویهها، خودکارسازی عملکردها، به اشتراکگذاری فوری دادهها و سازماندهی عملیات کمک کرده و متخصصان پزشکی را از انجام کارهای بسیار زیاد راحت میکند.
معایب استفاده از هوش مصنوعی در پزشکی
- نیازمند نظارت انسانی
- احتمال نادیده گرفتن متغیر های اجتماعی
- منجر شدن به بیکاری تعداد زیادی انسان در بلند مدت
- ناکافی بودن دقت
- مستعد خطرات امنیتی
اگرچه هوش مصنوعی راه درازی را در دنیای پزشکی طی کرده است، اما نظارت انسانی هنوز ضروری است. برای مثال، رباتهای جراحی بهجای همدلی، منطقی عمل میکنند. پزشکان ممکن است متوجه مشاهدات رفتاری حیاتی شوند که میتواند به تشخیص یا پیشگیری از عوارض پزشکی کمک کند.
هوش مصنوعی طی چند دهه اخیر رشد زیای در صنعت پزشکی داشته و پیشرفت مستمر این حوزه موجب شکلگیری تعاملات بیشتری میان متخصصان مراقبت های بهداشتی و کارشناسان فناوری شده است.
نیازهای بیمار اغلب فراتر از شرایط فیزیکی و آسیبهای جسمی ناشی از بیماری است و عواملی همچون عوامل اجتماعی، اقتصادی و تاریخی میتوانند در توصیههای مناسب برای بیماران نقش داشته باشند. به عنوان مثال، یک سیستم هوش مصنوعی میتواند یک بیمار را بر اساس تشخیص بیماری وی به یک مرکز درمانی ویژه ارتباط و ارجاع دهد ولی در عین حال هم ممکن است محدودیتهای اقتصادی بیمار یا سایر اولویتهای شخصی او را در نظر نگیرد.
حفظ حریم خصوصی و مخفی نگه داشتن اطلاعات بیمار در هنگام ترکیب فناوری هوش مصنوعی با حوزه پزشکی به یک مسئله جدی و قابل تامل تبدیل میشود. برندهایی مانند آمازون در جمعآوری و استفاده از دادهها قوانین آزاد دارند. از سوی دیگر، بیمارستانها ممکن است در هنگام تلاش برای کانالگذاری دادهها از طریق دستگاههای تلفن همراه اپل، با مشکلاتی مواجه شوند. این محدودیتهای قانونی و اجتماعی ممکن است توانایی هوش مصنوعی را برای تسهیل اقدامات پزشکی محدود کند.
اگرچه هوش مصنوعی به کاهش هزینهها و کاهش فشار بر روی پزشکان کمک کرده، در عین حال ممکن است برخی از مشاغل را نیز حذف کند. بنا بر گزارش مجمع جهانی اقتصاد در سال 2018 پیشبینی شده است که حضور هوش مصنوعی در پزشکی موجب از بین رفتن ۷۵ میلیون شغل و ایجاد ۱۳۳ میلیون شغل جدید شده که با تقسیم کار بین انسان، ماشین و الگوریتمها سازگار هستند.
اگرچه هوش مصنوعی وعده بهبود چندین جنبه از مراقبتهای بهداشتی و پزشکی را میدهد، اما در نظر گرفتن پیامدهای اجتماعی ادغام این فناوری بسیار مهم است.
هوش مصنوعی در پزشکی به شدت به دادههای تشخیصی موجود از میلیونها مورد فهرست بندی شده بستگی دارد. در مواردی که اطلاعات کمی در مورد بیماریهای خاص، جمعیت شناسی یا عوامل محیطی وجود دارد، تشخیص اشتباه کاملاً ممکن است. این عامل در هنگام تجویز داروی خاص اهمیت ویژهای پیدا می کند.
بدون توجه به سیستم، همیشه بخشی از داده های از دست رفته وجود دارد. در مورد نسخه ها، ممکن است برخی از اطلاعات مربوط به جمعیت های خاص و واکنشها به درمان ها وجود نداشته باشد. این اتفاق میتواند منجر به مشکلاتی در تشخیص و درمان بیمارانی شود که متعلق به گروههای جمعیتی خاص هستند.
هوش مصنوعی به طور مداوم در حال تکامل و بهبود است تا شکافهای داده را در نظر بگیرد. با این حال، توجه به این نکته مهم است که جمعیتهای خاص ممکن است هنوز از دانش دامنه موجود حذف شوند.
از آنجایی که هوش مصنوعی به طور کلی به شبکههای داده وابسته است، سیستمهای هوش مصنوعی در معرض خطرات امنیتی هستند. با شروع هوش مصنوعی تهاجمی، امنیت سایبری بهبود یافته برای اطمینان از پایداری فناوری مورد نیاز خواهد بود. مطالعات آماری نشان داده اند که بخش زیادی از تصمیم گیرندگان در صنعت امنیت متقاعد شدهاند که هوش مصنوعی تهاجمی یک تهدید در حال ظهور است.
از آنجایی که هوش مصنوعی از دادهها برای هوشمندتر و دقیقتر کردن سیستمها استفاده میکند، حملات سایبری هوش مصنوعی را برای هوشمندتر شدن با هر موفقیت و شکست ترکیب میکند و پیشبینی و پیشگیری از آنها را دشوارتر میکند. هنگامی که تهدیدات مخرب از دفاع امنیتی خارج شود، مقابله با حملات بسیار چالش برانگیزتر خواهد بود.
مثال هایی از هوش مصنوعی در صنعت بهداشت و درمان و شرکت های فعال و بزرگ این حوزه
صنعت هوش مصنوعی در پزشکی نیز مانند دیگر بخش های علوم و مهندسی کامپیوتر، صنعتی رو به رشد و نوین است که امروزه شرکتهای بزرگ بسیاری در حوزه های متفاوت آن مشغول به فعالیت هستند. شما میتوانید در صفحه شرکت های برتر فناوریبزرگترین غول های تکنولوژی جهان در سال 2021؛ معرفی 10 شرکت برتردر جهان امروز تکنولوژی مهم ترین و قدرتمند ترین ابزاری است که اقتصاد را شکل می دهد. تکنولوژی و فناوری اطلاعات (IT) تغییرات اساسی در تجارت و همچنین زندگی روزمره انسان ها ایفا می کنند. مروری بر بزرگترین شرکتهای کامپیوتری جهان داشته باشید.
در این بخش سعی شده تا چندین شرکت فعال و قوی در حوزه هوش مصنوعی در پزشکی معرفی گردند و توضیحاتی مختصر پیرامون فعالیت این شرکت ها داده شود.
- PathAI:
- Viz.ai:
- Buoy Health:
- Enlitic:
- Iterative Scopes:
PathAI فناوری یادگیری ماشینی را برای کمک به آسیب شناسان در تشخیص دقیق تر توسعه میدهد. اهداف فعلی این شرکت شامل کاهش خطا در تشخیص سرطان و توسعه روشهایی برای درمان پزشکی فردی است.
PathAI با توسعه دهندگان دارو مانند Bristol-Myers Squibb و سازمانهایی مانند بنیاد بیل و ملیندا گیتس برای گسترش فناوری هوش مصنوعی خود به سایر صنایع مراقبت های بهداشتی کار میکند.
در مراقبتهای بهداشتی، تأخیر میتواند به معنای تفاوت بین زندگی و مرگ باشد، بنابراین Viz.ai به تیمهای مراقبت کمک میکند تا با راه حلهای مراقبتهای بهداشتی مبتنی بر هوش مصنوعی سریع تر واکنش نشان دهند. محصولات هوش مصنوعی این شرکت میتوانند مشکلات را شناسایی کرده و تیمهای مراقبت را سریعاً مطلع کنند، و به ارائهدهندگان این امکان را میدهند تا در مورد گزینهها بحث کنند، تصمیمات درمانی سریعتری ارائه دهند، در نتیجه جان افراد را نجات دهند.
Buoy Health یک بررسی کننده علائم و درمان مبتنی بر هوش مصنوعی است که از الگوریتمهایی برای تشخیص و درمان بیماری استفاده میکند. نحوه کار به این صورت است: یک چت بات به علائم و نگرانیهای سلامتی بیمار گوش میدهد، سپس بیمار را بر اساس تشخیص خود او را راهنمایی میکند و روشهای مراقبتی صحیح را به او نشان میدهد.
هوش مصنوعی بویی که توسط تیمی از دانشکده پزشکی هاروارد توسعه یافته است به تشخیص و درمان سریعتر بیماران کمک میکند.
Enlitic ابزارهای پزشکی یادگیری عمیق را برای ساده کردن تشخیصهای رادیولوژی توسعه میدهد. پلتفرم یادگیری عمیق این شرکت، دادههای پزشکی بدون ساختار، تصاویر رادیولوژی، آزمایش خون، EKG، ژنومیک، تاریخچه پزشکی بیمار - را تجزیه و تحلیل میکند تا به پزشکان بینش بهتری نسبت به نیازهای آنی بیمار بدهد.
Iterative Scopes برای بهبود تشخیص و درمان بیماری، هوش مصنوعی را در گاستروانترولوژی اعمال می کند. سرویس استخدام هوش مصنوعی این شرکت از الگوریتمهای محاسباتی برای خودکار کردن فرآیند شناسایی بیمارانی استفاده میکند که واجد شرایط کاندید شدن بالقوه برای آزمایشهای بالینی بیماری التهابی روده هستند.
Iterative Scopes همچنین اولین کارآزمایی بالینی دستگاه SKOUT خود را ارائه کرد، ابزاری که از هوش مصنوعی برای کمک به پزشکان برای شناسایی پولیپهای بالقوه سرطانی استفاده میکند تا توسط FDA بررسی شود.
آیا باید از هوش مصنوعی در مراقبت های بهداشتی استفاده کرد؟
هوش مصنوعی بدون شک پتانسیلی برای بهبود سیستم های مراقبت های بهداشتی دارد. خودکار کردن کارهای خسته کننده می تواند برنامه های پزشک را آزاد کند تا امکان ارتباط بیشتر با بیمار فراهم شود. بهبود دسترسی به داده ها به متخصصان مراقبتهای بهداشتی در برداشتن گامهای صحیح برای پیشگیری از بیماری کمک می کند. دادههای بلادرنگ میتوانند بهتر و سریعتر به تشخیصها اطلاع دهند. هوش مصنوعی برای کاهش خطاهای اداری و صرفه جویی در منابع حیاتی اجرا میشود. شرکتهای کوچک و متوسط به طور فزایندهای در توسعه هوش مصنوعی مشارکت میکنند و این فناوری را کاربردیتر و با اطلاعات بهتر میسازند.
هوش مصنوعی به طور فزایندهای در مراقبتهای بهداشتی به کار میرود و محدودیتها و چالشها همچنان با آن مواجه میشوند و غلبه میکنند. هوش مصنوعی همچنان به نظارت انسانی نیاز دارد، ممکن است متغیرهای اجتماعی را حذف کند، شکافهایی را در اطلاعات جمعیت تجربه میکند و مستعد حملات سایبری محاسبه شده فزاینده است. علیرغم برخی از چالشها و محدودیتهایی که هوش مصنوعی با آن مواجه است، این فناوری نوآورانه مزایای فوق العادهای را برای بخش پزشکی نوید میدهد. چه یک بیمار یا یک پزشک، زندگی در همه جا به لطف هوش مصنوعی در حال بهبود است.
کاربردهای هوش مصنوعی در پزشکی چیست؟
از کاربردهای هوش مصنوعی در پزشکی و حوزه سلامت میتوان به تشخیص بیماریها که با مقایسه دی ان ای (DNA) فرد بیمار با یک دی ان ای (DNA) فرد سالم است تا درمان بیماریها به صورت درمان رفتاری، دارویی و درمان به وسیله دستگاههای جراحی اشاره کرد و همیچنین نظارتهای درمانی که با بررسی پیوسته حال بیمار، وضعیت وی را اعلام میکند.
چشم انداز آینده ی هوش مصنوعی در صنعت پزشکی
باور بر این است که هوش مصنوعی، در خدمات بهداشتی آینده تاثیر به سزایی خواهد داشت. بسیاری معتقدند، در پشت پرده ی پیشرفت و توسعه پزشکی دقیق، نقش اساسی را، هوش مصنوعی با اتکا به روش های یادگیری ماشین ایفا خواهد کرد. اگرچه تلاش های اولیه برای تشخیص بیماری و ارائه توصیه های درمانی، چالش برانگیز بوده، انتظار میرود هوش مصنوعی، این حوزه را نیز به سلطه ی خود در آورد. با توجه به سرعت پیشرفت هوش مصنوعی در زمینه آنالیز تصویر، به نظر میرسد سرانجام روزی، بیشتر تصاویر رادیولوژی و پاتولوژِی، توشط ماشین ها بررسی شوند.استفاده از قابلیت های تشخیص گفتار و متن که در حال حاضر برای وظایفی مانند ارتباط با بیمار و یادداشت علائم بالینی به کار میروند نیز، افزایش خواهد یافت.
بزرگ ترین چالش پیش روی هوش مصنوعی در زمینه پزشکی، این نیست که آیا تکنولوژی ها به اندازه ی کافی مفید هستند یا نه؛ بلکه اطمینان از پذیرش آن ها برای استفاده به طور روزانه است. برای به دست آمدن این اعتماد و پذیرش، هوش مصنوعی باید توسط تنظیم کننده ها تایید شود، با سیستم های EHR یکپارچه شود، به اندازه ای استاندارد شوند که محصولات مشابه به شکل مشابه کار کنند، به پزشکان آموزش داده شوند، هزینه آن ها توسط سازمان های دولتی یا غیر دولتی پرداخت شده و طی زمان به روز رسانی شوند.این چالش ها، روزی از سر راه کنار خواهند رفت، اما این امر بسیار بیشتر از بلوغ خود فناوری ها زمان میبرد؛ در نتیجه انتظار میرود تا 5 سال آینده شاهد استفاده محدود از هوش مصنوعی در زمینه های بالینی، و استفاده گسترده تر از آن، طی 10 سال آینده باشیم.
بدیهی است که هوش مصنوعی به طور کلی، جایگزین پزشکان انسانی نخواهد شد؛ بلکه توانایی آن ها را برای مراقبت های پزشکی افزایش خواهد داد. با گذر زمان، ممکن است پزشکان، به سمت مشاغلی سوق داده شودند، که نیازمند قابلیت های منحصر به انسان مانند همدلی، مشاوره ومتقاعد کردن افراد و درک جامع از شرایط هستند. احتمالا در میان افرادی که خدمات درمانی ارائه میدهند، تنها کسانی که از کار در کنار هوش مصنوعی امتناع کنند، شغل خود را از دست خواهند داد.
سلام به همه شما علاقه مندان به برنامه نویسی، به کاملترین صفحهای که برای معرفی و بررسی برنامه نویسی در وب فارسی وجود داره خوش اومدید 😉
احتمالا تا امروز اسم برنامه نویسی کامپیوتر یا Programming به گوشتان خورده و شاید حتی تمایل داشته باشید به یک برنامه نویس تبدیل شوید!
نمی توان بطور قطع گفت برای ادامه مسیر شغلی در برنامه نویسی، نیاز به تحصیل در رشته کامپیوتر دارید ولی اگر در رشته مهندسی یا علوم کامپیوتر تحصیل نمایید، بصورت پایه ای با زبان های برنامه نویسی آشنا شده و با برخی از آن ها کدنویسی خواهید کرد.
اما بیایید ابتدا به یک سوال بنیادین پاسخ دهیم؛ برنامه نویسی یا Programming چیست و برای تبدیل شدن به یک برنامه نویس موفق باید در چه راهی قدم گذاشت؟
می توان با اطمینان گفت یکی از بزرگترین آرزوهای دولوپرها و برنامه نویسان جهان، کار در شرکت های بزرگ فناوری همچون اپل، آمازون، IBM، گوگل، Cognizant و بسیاری دیگر از این غول های حوزه آی تی است؛ ارزش برند برخی از این شرکت ها چیزی حدود 700 میلیارد دلار است که چیزی بیش از 5 برابر کل بودجه پیشنهادی کشور ایران در سال آتی (1401) است!
درباره بزرگترین شرکت های حوزه آی تی بیشتر بخوانید.
برنامه نویسی چیست و به چه کسی برنامه نویس می گویند؟
برنامه نویسی به معنای اعطای فرامین به کامپیوتر جهت اجرا و خلق الگوریتم های کامپیوتری است. الگوریتمها با این دید طراحی میشوند که بعد از تبدیل به یک زبان برنامه نویسی مانند Python، Java یا C، برای اجرا به کامپیوتر داده شوند.
اگر تا امروز به کمک یک دستور غذایی آشپزی کردهاید، میتوانید خود را یک کامپیوتر دانسته و شخصی که رسپی آشپزی را تهیه کرده یک برنامه نویس بدانید. برنامهها هستند که کامپیوتر را وادار به انجام کاری میکنند در غیر اینصورت کامپیوترها تنها ماشینهایی پیچیده هستند که انرژی الکتریکی را به گرما تبدیل می کنند!
تعداد افرادی که در حال یادگیری برنامه نویسی هستند هر ساله رو به افزایش است بطوریکه امروز حدود 26.2 میلیون Software Developer (توسعه دهنده نرم افزار) در دنیا وجود دارد در حالی که این عدد در برابر مشاغل دیگری که به نوعی به Programming مربوط هستند، حتی به حساب نمی آید.
تا اینجا با مفهوم برنامه نویسی آشنا شدیم؛ اما برنامه نویس کامپیوتر کیست؟
برنامه نویس یا Programmer کسی است که به کمک زبانهای برنامه نویسی که از محبوب ترین آنها میتوان به پایتون، C و جاوا اشاره کرد، کدها را نوشته و برای اجرا به کامپیوتر می دهد.
تاریخچه برنامه نویسی کامپیوتر
بسیاری از مورخان معتقدند آدا لاولیس (Ada Lovelace) اولین کسی بود که یک برنامه کامپیوتری را منتشر کرد. این ریاضیدان در اواسط قرن نوزدهم برای اولین بار نوشتههای لوئیجی فدریکو منابریا را روی موتور تحلیلی ترجمه کرد. او در این ترجمه با افزودن یادداشتهای خود روشی برای محاسبه اعداد برنولی برای موتور تحلیلی معرفی کرد.
برنامه نویسی کامپیوتر برای اولین بار توسط آلونزو چرچ (Alonzo Church) و همچنین با ماشین تورینگ (انیگما) معرفی شد که به نوبه خود انقلاب بزرگی در زمینه رمزنگاری بود. انیگما یک ماشین محاسباتی است که در طول جنگ جهانی دوم توسط آلن تورینگ ساخته شد تا بتوانند کدهای آلمانها را رمزگشایی کنند. بعدها در دهه 1920 کامپیوترهایی ساخته شدند که قابلیت اجرای زبانهای برنامه نویسی را داشتند، به این ترتیب در قرن بعد با ادامه روند تکامل ماشینها و پیشرفت تکنولوژی تعداد زبانهای برنامهنویسی نیز افزایش یافت.
دولوپر کیست و چه تفاوتی با برنامه نویس دارد؟
دولوپر یا توسعهدهنده کسی است که نرم افزارها و برنامههای کاربردی را از صفر میسازد. فرق Developer با برنامه نویس در این است که دولوپر نه تنها کد منبع یک برنامه نرم افزاری را مینویسد بلکه آن را اشکال زدایی (دیباگ) کرده و سپس آن را اجرا میکند. در واقع دولوپر کسی است که مسئولیت کل پروژه تولید و ساخت یک برنامه کاربردی یا نرم افزار را به عهده دارد و ممکن است چندین برنامه نویس زیر نظر او کار کنند؛ در حالی که برنامه نویس کسی است که صرفاً مسئولیت نوشتن کد برنامه را به عهده دارد.
بنابراین وظایف دولوپر به مراتب بیشتر از یک برنامه نویس است و بعضاً به نامهای توسعهدهنده نرم افزار یا مهندس نرم افزار نیز شناخته میشود.
اکثر دولوپرها برای توسعه محصولات یا خدمات خود از یک یا چند زبان برنامه نویسی استفاده میکنند. شرکتهایی مثل مایکروسافت و اوراکل به دلیل پیچیدگی محصولات و خدماتی که توسعه میدهند و به مشتریان میفروشند دولوپرهای زیادی استخدام میکنند.
برنامهنویس خوب چه کسی است و چگونه یک برنامه نویس خوب باشیم؟
یادگیری کدنویسی آسان است، اما کد خوب نادر است. کد خوب در پیش نویس اول به سختی پیدا میشود. پس از کار با صدها توسعهدهنده، ما میتوانیم ویژگیهای اصلی یک کد خوب را شناسایی کنیم. ما درک میکنیم که برای توسعه دهنده نرم افزار بسیار مهم است که کد خوبی بنویسد تا آن را قابل نگهداری تر، خواناتر، توسعه پذیرتر و بدون اشکال کند.
درک این نکته مهم است که کدنویسی دریچه اولیه موفقیت برای برنامه نویسان است، اما چیزی که یک برنامه نویس خوب را می سازد بسیار بیشتر است. هر برنامه نویس بزرگی از چند روش خوب پیروی میکند:
- اشتیاق برای یادگیری :
فناوری حوزهای است که همیشه در حال تغییر است. همیشه یک نوآوری وجود دارد که به وقوع میپیوندد. زبان های برنامه نویسی جدید با نحو (Syntax) بهبود یافته و شیوههای بهتر مورد توجه قرار می گیرند. چارچوبها و کتابخانههای جدیدی برای بهبود فرآیند توسعه معرفی شدهاند. دانستن همه این نوآوریها و انتخاب ویژگیهای مهم برای کمک به توسعه دهندگان برای بهبود کد خود، منجر به کدی بدون اشکال و قابل نگهداری میشود.
زمانی که فناوری همیشه در حال پیشرفت است و مهارتها و تواناییهای یک برنامه نویس امروزی احتمالاً در چند سال آینده منسوخ میشوند، این ویژگی به شدت توسط متقاضیان نادیده گرفته میشود. مهم است که برنامه نویسی باشید که علاقه مند به همگام شدن با آخرین روندها باشد و مشتاق استفاده از هر فرصتی برای یادگیری مهارت های جدید و بهبود مهارتهای موجود باشد.
راههای زیادی برای دانستن آخرین روندهای بهبود یافته در دنیای فناوری وجود دارد، بهعنوان مثال، پیوستن به جوامع فناوری، شرکت در رویدادهای فناوری، صحبت با رهبران و بحثهای منظم.
- ارتباطات منظم :
توسعه محصول یک فرآیند بسیار پویا است. یکی از ویژگی های یک برنامه نویس خوب این است که به هر ذینفعی (Stakeholder) اجازه میدهد تا از وضعیت کد، روان یا مسدود بودن آن مطلع شود. ارتباط منظم کلید محصولات عالی است. مهارتهای ارتباطی خوب به طور مستقیم با مهارتهای توسعه خوب ارتباط دارد.
یک توسعه دهنده نرم افزار عالی میتواند مشکلات را به وضوح درک کند، آنها را به فرضیهها تقسیم کند و راه حلهایی را به شیوهای منسجم پیشنهاد کند. آنها مفاهیم را به سرعت درک میکنند، یا سؤالات مناسبی را برای فهمیدن میپرسند. این در واقع یکی از ویژگیهایی است که در توسعه دهندگان نادر است زیرا بیشتر برنامه نویسان درونگرا هستند و فقط دوست دارند با برنامه نویسان دیگر ارتباط برقرار کنند. ابزارهایی مانند Jira، Trello به هر ذینفع کمک میکند تا از وضعیت هر ویژگی در محصول آگاه شود.
- مدیریت زمان و وظایف :
فناوری اگر به خوبی نگهداری و ردیابی نشود، میتواند بسیار پیچیده باشد. یک برنامه نویس خوب همه را در جریان قرار میدهد که کد به چه مرحلهای رسیده است و چه ویژگیهایی باقی مانده است. شکستن الزامات تجاری در الزامات فناوری نیز هنری است که برنامه نویسان بزرگ میتوانند به آن دست یابند. ابزارهایی مانند Jira به ردیابی ویژگیهای فنی کمک میکند. همچنین کدنویسی چیزی است که نیاز به زمان و تلاش دارد. بنابراین آنها زمان خود را به خوبی مدیریت میکنند تا بین کار و زندگی تعادل برقرار کنند!
یک برنامه نویس عالی بسیار قابل اعتماد است. آنها اخلاق کاری قوی دارند و به موقع در جلسات حاضر میشوند. یک مهارت مهم، توانایی تخمین مقدار زمان مورد نیاز برای تکمیل یک کار، برقراری ارتباط با آن و انجام آن است. توسعه دهندگان استثنایی در مدیریت مشتریان یا رهبران خود به جای اینکه شما آنها را مدیریت کنید عالی هستند.
- تجربه فنی گسترده :
فقط دانستن یک فناوری یا یک زبان برنامه نویسی یک استعداد بسیار اساسی است. برنامه نویسان خوب همیشه در یک فناوری به کارایی میرسند و سپس از فناوریهای دیگر آگاه میشوند. این به آنها کمک میکند تا از نحوه عملکرد کل سیستم آگاه شوند. به عنوان مثال، توسعه دهندگان (Front-end) مشتاقند بدانند چه کسی از دادههایی استفاده میکند که کاربر وارد می کند و چگونه Back-end این دادهها را پردازش میکند. بسیاری از شرکت ها اهمیت این عمق و وسعت فناوریها را میدانند، بنابراین بسیاری از شرکت ها به چرخش منظم برنامه نویسان اعتقاد دارند.
یک توسعه دهنده با تجربه در بهترین شیوهها مانند توسعه چابک و نرم افزار های مدیریت وظایف مانند Jira و Trello به خوبی آشنا است. آنها همچنین بر کنترل نسخه، محیطهای مختلف توسعه و فرآیند استقرار برنامهها تسلط دارند.
- کار تیمی :
برنامه نویسان گرگهای تنها هستند و معتقدند بهترین مشارکت کنندگان فردی هستند. برنامه نویسان خوب ارزش یک تیم را میدانند و بنابراین سعی میکنند فناوری را در تیم یاد بگیرند و بحث کنند. توسعه دهندگان خوب دیگران را با آموختهها و تجربیات خود آموزش میدهند. آنها توسعه دهندگان جوان را تشویق میکنند تا سؤال بپرسند و آموختههای خود را به اشتراک بگذارند.
آنها به هم تیمیها کمک میکنند، مهارتهای جدیدی را به دیگران آموزش میدهند و اسنادی را مینویسند که به هم تیمیها نه تنها در سازمانشان بلکه به طور کلی به جامعه توسعهدهنده کمک میکند. ابزارهایی مانند Confluence برای ایجاد اسناد در سطح تیم استفاده میشود. جدا از روابط حرفهای، بازیهای آنلاین و گردشهای تیمی واقعاً راه های عالی برای ایجاد پیوند در سطح تیم هستند.
کاربردهای برنامه نویسی رایانه
تقریباً همه سیستمهای هوشمندی که اطراف خود میبینید نتیجه برنامه نویسی رایانه هستند. اما اگر بخواهیم دقیقتر نگاه کنیم از کاربردهای برنامه نویسی کامپیوتر میتوان به موارد زیر اشاره کرد:
- راهاندازی وبسایتها و استفاده از برنامههای آنلاین و تحت وب
- طراحی و راهاندازی نرمافزارهای کامپیوتری: در این حوزه یک دولوپر مسئولیت طراحی و توسعه یک برنامه یا نرمافزار کامپیوتری را بهعهده میگیرد. اولین مرحله طراحی رابط کاربری است که توسط یک طراح رابط کاربری (UI) انجام میشود و بعد کاربر پسند بودن طراحی (UX) بررسی میشود. سپس گروهی متخصص از برنامه نویسان کامپیوتر نرم افزار را پیادهسازی میکنند.
- طراحی و ایجاد بازیهای کامپیوتری
- برقراری ارتباط با سخت افزار: در این مدل برنامه نویسی که اصطلاحاً برنامه نویسی سیستمی نام دارد، برنامه نویس میتواند با کد نویسی و اجرای فرمانهای نوشته شده، تغییراتی در یک سخت افزار ایجاد کند. فرضاً میتواند با اجرای یک دستور ساده یک چراغ LED را روشن و خاموش کند. از این نوع کد نویسی به شکل پیشرفته در طراحی ریزپردازندهها استفاده میشود.
آنالیز داده و استفاده از ابزارهای آماری و تحلیلی: متخصصین حوزههای دادهکاوی و هوش تجاری برای محاسبات آماری و نمایش گرافیکی دادهها از یک سری زبانهای برنامه نویسی خاص (مثل R) استفاده میکنند. امروزه بسیاری از شرکتهای بزرگ دنیا که با دادههای بزرگ سر و کار دارند برای تجزیه و تحلیل این دادهها متخصصین زبانهای برنامهنویسی تحلیل داده استخدام میکنند. شرکتهایی مثل فیسبوک، اوبر، گوگل، مایکروسافت و ... .
فهرست محبوب ترین زبان های برنامه نویسی کامپیوتر
حوزه برنامه نویسی با سرعت هرچه تمامتر رو به جلو حرکت میکند و این پیشرفت سریع موجب میشود برنامه نویسان برای موفق بودن در حوزه کاری خود زبانهای برنامه نویسی متعددی یاد بگیرند. در ادامه فهرستی از محبوبترین زبانهای برنامه نویسی کامپیوتر در سال 2020 به همراه میزان محبوبیت هریک آورده شده است:
- Rust: 86.1٪
- TypeScript: 67.1٪
- Python: 66.7٪
- Kotlin: 62.9٪
- GO: 62.3٪
- Julia: 62.2٪
- Dart: 62.1٪
- C#: 59.7٪
- Swift: 59.5٪
- JacaScript: 58.3٪
میزان حقوق و آینده شغلی برنامه نویس کامپیوتر
حقوق یک برنامه نویس کامپیوتر درست مثل سایر مشاغل بستگی به تجربه کاری شخص برنامه نویس دارد. بنابر اطلاعات به دست آمده از سایت ایران سلری (Iran Salary) میزان حقوق برنامه نویسان در سال 1400 حداقل 2 میلیون و حداکثر 16 میلیون تومان متغیر بوده است.
بر اساس اطلاعات مربوط به سال 1400 منتشر شده توسط این سایت، میزان حقوق برنامه نویسانی با تجربه کاری کمتر از یک سال بطور میانگین 3.5 میلیون، بین یک تا سه سال 4.5 میلیون، بین سه تا پنج سال 6 میلیون، بین پنج تا هفت سال 7.2 میلیون، بین هفت تا 10 سال 8.2 میلیون، بین 10 تا 15 سال 8.9 میلیون، بین 15 تا 20 سال 10.2 میلیون، بین 20 تا 30 سال 10.9 میلیون و بیش از 30 سال 9.3 میلیون تومان بوده است.
با روند رو به رشد توسعه وب و اپلیکیشن ها، نیاز شرکت ها به برنامه نویس رو به افزایش است و این تأییدی است بر افزایش درآمد برنامه نویسیبررسی درآمد برنامه نویسی در ایران و خارج از کشور در 1402در این صفحه عالی به بررسی درآمد برنامه نویسی در ایران و خارج از کشور پرداخته، همچنین در خصوص راههای کسب درآمد از برنامه نویسی و درآمد زبان های مختلف صحبت شده است. و آیندهای روشن برای این شغل.
کسب عنوان برنامه نویس کامپیوتر
برای کسب عنوان برنامه نویس کامپیوتر فرد باید حداقل به یک زبان برنامه نویسی مسلط باشد و بتواند توسط آن زبان کد نویسی کند. عدهای تصور میکنند برای کسب عنوان برنامه نویس کامپیوتر حتماً باید مدرک دانشگاهی مهندسی کامپیوتر داشته باشند که البته پر بیراه هم نیست.
دانشجویان رشته های کامپیوتر شامل مهندسی و علوم کامپیوتر، از زمان شروع تحصیل در دوران کارشناسی، درسی را تحت عنوان "مبانی کامپیوتر و برنامه نویسی" گذرانده و با مقدمات برنامه نویسی آشنا میشوند؛ این در حالی است که دانشجویان این دو رشته هر کدام بطور تخصصیتری نیز در مباحث Programming آموزش میبینند. دانشجویان میتوانند در کنار این آموزشها به صورت خودخوان یا شرکت در دورههای برنامه نویسی آنلاین و حضوری، مهارتهای خود را تقویت کنند.
پس از انتخاب یک زبان، تسلط به زبان مورد نظر و اجرای چندین و چند برنامه مبتنی بر آن زبان میتوان گفت مسیر حرفهای فرد به عنوان برنامه نویس کامپیوتر آغاز میشود.
برای آموزش برنامه نویسی باید از کجا شروع کرد؟
به دلیل اهمیت فراوان این مسئله، مقالهای جداگانه در خصوص این پرسش که چگونه باید آموزش برنامه نویسیچگونه آموزش برنامه نویسی را بصورت حرفهای شروع کنیم؟چگونه آموزش برنامه نویسی را حرفه ای شروع کنیم؟ این یکی از سوالات متداول تمامی افرادی است که میخواهند آموزش برنامه نویسی را شروع کنند. در این صفحه این موضوع مورد بررسی و موشکافی قرار گرفته است را بصورت حرفهای شروع کنید برای شما عزیزان قرار داده شده که توصیه اکید میکنیم این مقاله را نیز بصورت کامل مطالعه کنید.
ابتدا باید زمینه برنامه نویسی و پلتفرم کاری خود را انتخاب کنید به این معنی که مشخص کنید در کدام یک از سه زمینه برنامه نویسی موجود میخواهید کار کنید؟
1- برنامه نویسی تحت وب
2- برنامه نویسی موبایل
3- برنامه نویسی دسکتاپ
پس از اینکه زمینه برنامه نویسی خود را مشخص کردید باید یکی از زبانهای برنامه نویسی مناسب برای آن زمینه را انتخاب کنید. سپس میتوانید بصورت خودآموز و با استفاده از فیلم ها و آموزشهای رایگانی که در اینترنت وجود دارد آن زبان برنامه نویسی را یاد بگیرید و یا اینکه در کلاسهای آموزشی مربوط به آن زبان برنامه نویسی شرکت کرده مهارت کدنویسی خود را ارتقا دهید.
کتاب هایی که هر برنامه نویسی باید حداقل یکبار بخواند
اگر برنامه نویس هستید، باید خواننده خوبی نیز باشید زیرا ذهن را توسعه میدهد و ذهن سلاح شماست، شما باید آن را روزانه آموزش دهید. قبل از یافتن هر راه حلی برای یک مسئله، خواندن و درک مسائل مهم ترین رکن برای حل آن مسئله است. بدون مهارت خواندن و درک خوب، فرد زمان بیشتری را برای درک مشکلات قبل از حل آن صرف میکند.
در زیر لیستی از کتابهایی که هر برنامه نویسی باید بخواند وجود دارد. این کتابها نه تنها نحو (Syntax) و معناشناسی زبان های برنامهنویسی را آموزش میدهند، بلکه به شما کمک میکنند تا فکر کنید، سازماندهی کنید و به حلکننده خوبی برای مسائل تبدیل شوید، که در واقع مهمترین درس برای یک برنامه نویس است. این کتابها نه تنها برای تسلط بر یک زبان برنامه نویسی خاص مانند C++، جاوا یا پایتون هستند، بلکه به شما کمک میکنند تا برنامه نویس بهتری شوید.
- Clean Code :
حتی کد بد هم میتواند کار کند. اما اگر کد تمیز نباشد، می تواند یک سازمان را به زانو درآورد. هر سال، ساعتهای بی شماری و منابع قابل توجهی به دلیل کد نوشته شده ضعیف از بین میروند. اما لازم نیست اینطور باشد.
رابرت سی. مارتین (Robert C. Martin)، کارشناس معروف نرم افزار، یک الگوی انقلابی را با Clean Code ارائه میدهد. مارتین با همکارانش همکاری کرده است تا بهترین روش چابک خود در پاکسازی کد که در حال پرواز (on the fly) نام دارد را به کتابی تبدیل کند که ارزشهای یک مهندس نرمافزار را در درون شما القا میکند و شما را به برنامهنویس بهتری تبدیل میکند، اما فقط در صورتی که در چارچوب آن کار کنید.
در این کتاب، شما در حال خواندن کد خواهید بود، تعداد زیادی کد، و در مورد اینکه چه چیزی در آن کد درست است و چه چیزی اشتباه است، به چالش کشیده خواهید شد. مهمتر از آن، شما برای ارزیابی مجدد ارزشهای حرفهای و تعهد خود به حرفه خود به چالش کشیده خواهید شد.
Code به سه قسمت تقسیم میشود، اولی اصول، الگوها و شیوههای نوشتن کد تمیز را شرح میدهد، بخش دوم شامل چندین مطالعه موردی با افزایش پیچیدگی است. هر مطالعه موردی تمرینی برای تمیز کردن کد است. تبدیل یک پایه کد که دارای مشکلاتی است به یک پایه صحیح و کارآمد، بخش سوم نتیجه است: یک فصل منفرد حاوی فهرستی از اکتشافات جمع آوری شده در هنگام ایجاد مطالعات موردی است. نتیجه یک پایگاه دانش است که طرز فکر ما را هنگام نوشتن، خواندن و پاک کردن کد توضیح میدهد.
این کتاب برای هر توسعهدهنده، مهندس نرمافزار، مدیر پروژه، سرپرست تیم یا تحلیلگر سیستم که علاقهمند به تولید کد بهتر است، ضروری است.
خواننده این کتاب به درک مفاهیم زیر خواهد رسید:
- نحوه تشخیص کد خوب و بد
- چگونه کد خوب بنویسیم و چگونه کد بد را به کد خوب تبدیل کنیم
- نحوه ایجاد نامهای خوب، توابع خوب، اشیاء خوب و کلاسهای خوب
- نحوه قالب بندی کد برای حداکثر خوانایی
- نحوه پیاده سازی مدیریت کامل خطا بدون پنهان کردن منطق کد
- نحوه تست واحد (Unit Test) و تمرین توسعه تست محور(Test-Driven Development)
- The Pragmatic Programmer :
این کتاب به هیچ وجه در مورد هیچ زبان برنامه نویسی خاصی نیست، حکمت موجود در این کتاب برای همه زبان های برنامه نویسی صدق می کند.
کتابی کلاسیک در این زمینه است و اغلب به عنوان کتاب درسی در دورههای دانشگاهی مورد استفاده قرار میگیرد، کتابی است که توصیههای عملی و صحیح برنامه نویسی را ارائه میدهد که میتوانید در هر پروژه توسعه ای از آن استفاده کنید.
این کتاب از قیاسها و داستانهای کوتاه برای ارائه روشهای توسعه و هشدارها استفاده میکند، برای مثال نظریه پنجرههای شکسته (Broken Windows Theory)، داستان سوپ سنگ (Stone Soup)، یا قورباغه در حال جوشیدن (Boiling Frog). برخی از مفاهیم در کتاب نامگذاری یا رایج شدند، مانند کاتاهای کد (Code Katas)، تمرینهای کوچک برای تمرین مهارت های برنامهنویسی، DRY (مخفف Don't Repeat Yourself) و اشکالزدایی اردک لاستیکی (Rubber Duck Debugging)، روشی برای اشکالزدایی که نام آن ارجاع به داستانی در کتاب است.
- Code Complete :
این کتاب توصیههای سطح بالایی در مورد کد ارائه میکند، از اهمیت غلبه بر پیچیدگی تا مراقبت از سقوط سنگ (یعنی علائم هشدار دهنده)، همچنین بخش بزرگی در مورد نحوه نوشتن کد با کیفیت بالا دارد که به سطوح ثابتی از انتزاع نیاز دارد که با مرزهای واضح از هم جدا شوند. در مجموع، یک کتاب مرجع مهم با توصیه های فوق العاده است.
مک کانل (Steve McConnell) فعالیت های اصلی در ساخت و ساز را طراحی دقیق، برنامه ریزی ساخت و ساز، کدگذاری و اشکال زدایی، تست واحد، یکپارچه سازی و آزمایش یکپارچه سازی تعریف می کند. اگرچه او ارزش سایر جنبههای توسعه نرم افزار مانند الزامات و مستندات را نادیده نمیگیرد، او به دلایل متعددی بر ساخت نرم افزار تأکید میکند.
تنها درصد کمی از توسعه دهندگان نرم افزار این کتاب را میخواندند، بنابراین اگر این کتاب را بخوانید مطمئناً مزیتی خواهید داشت. تنها با مطالعه این کتاب میتوانید چندین سال تجربه کسب کنید.
- Coders at Work :
تمرکز این کتاب بر این است که برنامه نویسان چگونه کار خود را انجام میدهند و چگونه خود را میبینند. نشان میدهد که برنامه نویسان معروف اغلب هیچ تفاوتی با برنامه نویسان دیگر ندارند و با همان مشکلاتی دست و پنجه نرم میکنند که بقیه انسانها نیز میکنند.
موضوعات اولیه در این مصاحبهها شامل نحوه یادگیری برنامه نویسی توسط مصاحبه شوندگان، نحوه اشکال زدایی کد، زبانها و ابزارهای مورد علاقه آنها و غیره است.
- The Mythical Man-Month :
موضوع اصلی این کتاب این است که افزودن نیروی انسانی به پروژه نرم افزاری که از برنامه عقب مانده است، آن را حتی بیشتر به تأخیر میاندازد. این ایده به قانون بروکس (Brooks's law) معروف است و همراه با اثر سیستم دوم (Second-System Effect) و حمایت از نمونه سازی (Prototyping) ارائه شده است.
The Mythical Man-Month نسبت به سایر کتابهای این فهرست کوتاهتر است و در مدت زمان کمتری خوانده میشود. یک کتاب عالی برای مدیران پروژه یا مدیران از هر نوعی است تا پیچیدگی های پروژه های نرمافزاری را که آنها را از انواع دیگر پروژهها متمایز میکند، بهتر درک کنند.
چگونه به عنوان یک توسعه دهنده، شغل پیدا کنیم؟
با توجه به مشاغل پرسود و انعطاف پذیری که در حوزه فناوری وجود دارد (بسیاری از این مشاغل فنی به مدرک مرتبط با رشته کامپیوتر نیاز ندارند)، و فرصتهای رو به رشد برای داشتن یک شغل فنی خارج از شرکت های فناوری، ممکن است از خود بپرسید: چگونه وارد توسعه نرم افزار شوید و برنامه نویس شوید؟ آیا به دست آوردن یک شغل توسعه دهنده جوان (Junior) سخت است؟ و برای گرفتن شغل توسعه دهنده چه کاری باید انجام دهم؟
- یک سایت نمونه کارها (Portfolio) پر از کارهای مرتبط بسازید :
شما باید هر کاری را که برای شرکتها یا مشتریان انجام دادهاید (با اجازه آنها) و احساس خوبی نسبت به آن دارید، درج کنید، و به یاد داشته باشید که پروژههایی را که محدوده شما را به عنوان یک طراح و توسعهدهنده نشان میدهند، بگنجانید. آنچه در اینجا مهم است این است که شما در حال بارگذاری کارهای قوی و تمیز هستید که نشان دهنده سطح مهارت و برند شما باشد.
- رزومه خود را اصلاح کنید :
حتی اگر نمونه کار شما جایی است که مهارتهای خود را به عنوان یک توسعهدهنده جوان نشان میدهید، اکثر شرکتها همچنان رزومه میخواهند و از آن برای حذف نامزدها استفاده میکنند. این بدان معناست که مال شما باید به اندازه نمونه کارها حرفهای باشد. اطمینان حاصل کنید که مهارتهای اصلی خود را برجسته کردهاید، تجربههای مرتبط با فناوری را انجام دادهاید و جزئیات خاصی را برای اثبات دستاوردها و نقاط قوت خود ارائه میدهید.
علاوه بر این، برای انتخاب یک الگوی تمیز و آسان برای استفاده به عنوان رزومه وقت بگذارید. مجموعهای از الگوهای رزومه به صورت رایگان در سراسر اینترنت موجود هستند، و کارفرمای آینده شما از شما به خاطر ارائه تمام تجربیات شما به شیوهای واضح و بصری خوشایند تشکر خواهد کرد. به یاد داشته باشید، شما میخواهید به همان اندازه که کارفرمای شما میخواهد کسی را استخدام کند، استخدام شوید!
- اخبار صنعت را دنبال کنید :
منابعی را برای پیگیری اتفاقات فناوری در نظر بگیرید. این هم برای اولین مصاحبه شغلی شما و هم برای تمام صحبتهای کوچکی که با دوستان فناوری جدید انجام میدهید بسیار مهم است. لازم نیست در هر داستان یا موضوعی متخصص باشید. فقط بدانید چه چیزی داغ است و چه اتفاقی میافتد. میتوانید وبلاگها یا سایتهای خبری فناوری را در وعده صبحانه بخوانید یا وقتی در صف فروشگاه منتظر هستید فهرستهای توییتر را دنبال کنید.
- به طور منظم مهارت های جدید و مرتبط را بیاموزید :
علاوه بر پیگیری اخبار، باید با مهارتها و ابزارهای جدید تجارت نیز همراه باشید. بهعنوان یک توسعهدهنده سطح ابتدایی، دانستن این موارد شما را بسیار مورد تقاضا قرار میدهد. اینکه چه مهارت هایی را باید بیاموزید بستگی به زمینه ای دارد که علاقه مندید در آن فعالیت کنید.
- جستجوی شغل خود را برای مشاغل توسعهدهنده جوان شروع کنید :
اکنون که تلاش بیشتری را با انجام مراحل گفته شده انجام داده اید، زمان آن رسیده است که به لیست مشاغل واقعی توسعه دهنده در سطح ابتدایی بپردازید. با جستجوی ساده «توسعهدهنده جوان» در سایتهایی مانند Jobvision، Jobinja و Quera شروع کنید و نگران شرکت یا مکان نباشید. ایده این است که شما ببینید کارفرمایان به دنبال چه هستند و به طور کلی چه نوع گزینههایی در دسترس هستند.
به خاطر داشته باشید که شرح شغلها بیشتر از آنچه واقعاً از نامزدها انتظار میرود، الزامات و مهارتهای فنی را فهرست میکنند (گاهی اوقات بسیار بیشتر!). اجازه ندهید این شما را دلسرد کند، بسیاری از مدیران استخدامی تصمیم خود را بر اساس توانایی شما برای یادگیری در محل کار میگیرند - هیچ کس قرار نیست از همه چیز در موقعیت جدید مطلع شود و شما آموزشهای حین کار (حتی در استارتآپها!) را خواهید دید.
هنگامی که احساس کردید چه چیزی وجود دارد، رزومه خود را برای مشاغلی که واقعاً به آنها علاقه دارید ارسال کنید. واقع بین باشید اما خجالتی نباشید. هیچ کس با در دست داشتن موقعیت توسعه دهنده در خانه شما را نخواهد زد. به همه دوستان، خانواده، همسایگان، و … اجازه دهید بدانند که شما فعالانه به دنبال شغل هستید.
- مصاحبه برای شغل، حتی اگر مطمئن نیستید که آماده هستید :
وقتی آن لحظه شاد درخشان اتفاق میافتد و از شما خواسته میشود مصاحبه کنید، آن را دنبال کنید! تجربهای که از نشستن حضوری یا چت ویدیویی با یک کارفرمای بالقوه به دست خواهید آورد، شما را به یک نامزد رقابتیتر برای مشاغل تبدیل میکند.
لباس راحت اما حرفه ای بپوشید، سوالات حل مسئله را با یکی از دوستان یا اعضای خانواده تمرین کنید و از قبل در مورد شرکت تحقیق کنید تا برای کارفرما نیز سوالاتی داشته باشید.
قبل از مصاحبه درباره میزان حقوق دریافتی موقعیت شغلی مورد نظرتان تحقیق کنید و میانگینی از حقوق های داده شده را در ذهن داشته باشید، تا هنگامی که کارفرما از میزان حقوق مورد انتظارتان سوال میکند، بتوانید جواب قانع کننده ای بدهید.
مهم نیست اولین مصاحبه شما چگونه پیش برود، از این تجربه جان سالم به در خواهید برد، که مصاحبه بعدی را بسیار آسان تر میکند. بعلاوه شما ایده بسیار بهتری در مورد نحوه انجام مصاحبه های آینده خواهید داشت و باید روی آنها کار کنید. در کمترین زمان، به جای اینکه فقط برای مشاغل توسعه دهنده جوان درخواست دهید، اولین شغل خود را میپذیرید!
- فرآیند را تکرار کنید:
نکته جالب در مورد مشاغل توسعه دهنده جوان (و به طور کلی مشاغل توسعه دهنده) این است که کد شما بیشتر از آنچه در رزومه شما است برای شما صحبت می کند. اگر از مصاحبه خود پیشنهاد کاری دریافت نکردید، ادامه دهید. روی پروژههایی کار کنید تا به مجموعه خود اضافه کنید. هرچه تعداد بیشتری در مجموعه خود داشته باشید، مهارت های کدنویسی شما قوی تر به نظر میرسد و مهمتر از آن قوی تر می شود. در مصاحبه بعدی، شما کاندیدای قوی تری خواهید بود.
البته یکی از فاکتورهای مهم در انتخاب حوزه مورد نظرتان، توجه به میزان درآمد آن حوزه است، برای مثال اگر قصد انتخاب یکی از زبان های برنامه نویسی را دارد باید درآمد برنامه نویسیبررسی درآمد برنامه نویسی در ایران و خارج از کشور در 1402در این صفحه عالی به بررسی درآمد برنامه نویسی در ایران و خارج از کشور پرداخته، همچنین در خصوص راههای کسب درآمد از برنامه نویسی و درآمد زبان های مختلف صحبت شده است. با زبان های مختلف بررسی کرده و سپس بر اساس علاقه و محبوبیت آن زبان، تصمیمتان را بگیرید.
مطالب زیر ممکن است برای شما مفید باشد :
- رشته مهندسی کامپیوترمهندسی کامپیوتر چیست؟ معرفی رشته کامپیوتر توسط اساتید شریفاین صفحه به معرفی کامل رشته کامپیوتر، اعم از دروس رشته کامپیوتر، درآمد رشته کامپیوتر، شغل های رشته کامپیوتر، گرایش ها و زیر شاخه های رشته کامپیوتر پرداخته است
- زبان برنامه نویسی برای شروعبهترین زبان برنامه نویسی برای شروع چیست؟در این مقاله عالی بهترین زبان برنامه نویسی برای شروع معرفی شده و بررسی شده که بهتر است برای ورود به برنامه نویسی با چه زبانی شروع کنید
- شی گراییبرنامه نویسی شی گرا چیست؟ شی گرایی چیست؟این صفحه عالی به معرفی برنامه نویسی شی گرا پرداخته و توضیح داده شی گرایی یا همان object oriented یا OPP چیست؟ همچنین مزایای برنامه نویسی شی گرا را بیان کرده
- الگوریتم چیستالگوریتم چیست به زبان ساده و با مثال های فراواندر این مقاله به زبان بسیار ساده و با مثال های متعدد توضیح داده شده که الگوریتم چیست و چه کاربردهایی دارد
- هوش مصنوعی به زبان سادههوش مصنوعی (AI) چیست؟ انواع، کاربردها، مزایا و معایبهوش مصنوعی یا Artificial Intelligence یا به اختصار AI، امروزه کاربردهای بسیاری پیدا کرده و به یکی از داغترین حوزههای بشر تبدیل شده است، اما با این وجود بسیاری از افراد با کاربردهای آن آشنایی کامل ندارند، به همین علت در این صفحه کاربردها، مزایا و معایب AI بطور کامل بررسی شده است
بهترین منابع رایگان برای یادگیری برنامه نویسی
اگر علاقه مند به یادگیری کدنویسی و برنامه نویسی هستید، در این پست، بهترین وب سایتها را برای یادگیری برنامه نویسی به شما معرفی خواهیم کرد.
- Udemy :
Udemy با ارائه بیش از 170000 دوره رایگان و پولی، یک وب سایت آموزش آنلاین است که در آن افراد میتوانند انواع مختلفی از مهارتها، از موسیقی گرفته تا فناوری اطلاعات و نرم افزار را بیاموزند. بخش توسعه (Development) به تنهایی دارای هزاران دوره آنلاین از جمله کلاسهای توسعه وب، علم داده و یادگیری ماشین است.
- Sololearn :
آیا میخواهید برنامه نویسی را در موبایل خود یاد بگیرید؟ اگر بخواهید SoloLearn مناسب ترین گزینه است. SoloLearn یک برنامه موبایل برای iOS و Android دارد. این وب سایت بستر مناسبی برای بهبود مهارتهای فنی شماست. در اینجا میتوانید بسیاری از دورههای برنامه نویسی رایگان را با تمرین در دنیای واقعی پیدا کنید. اگر میخواهید HTML و CSS یا زبانهای برنامه نویسی پیشرفته تر یاد بگیرید، میتوانید از این وب سایت استفاده کنید. همچنین میتوانید با استفاده از تالار گفتمان این سایت از دانشجویان دیگر کمک بگیرید.
- Coursera :
Coursera یک سایت آموزش آنلاین است که با بیش از 200 دانشگاه و شرکت برای ارائه هزاران دوره همکاری میکند. این کلاسها موضوعات مختلفی از تجارت گرفته تا علوم کامپیوتر را پوشش میدهند.
- Khan Academy :
خان آکادمی، یک سازمان غیرانتفاعی معروف، منابع آموزشی و یادگیری را به صورت رایگان ارائه میدهد. این سازمان مجموعه گسترده ای از دورهها را در موضوعات مختلف از جمله مبانی برنامه نویسی و علوم کامپیوتر ارائه می دهد. همچنین دارای یک برنامه موبایل برای iOS و Android است که کاملا رایگان و بدون اشتراک یا خرید درون برنامه ای است.
- edX :
edX دورههای واقعی در سطح کالج را از برخی از بهترین دانشگاههای جهان ارائه میدهد. edX در سال 2012 توسط دانشگاه هاروارد و MIT تاسیس شد و بیش از 160 دانشگاه عضو در سراسر جهان را شامل می شود. نیازی به گفتن نیست که کیفیت سخنرانیها و محتوا در مقایسه با بسیاری از سایتهای کدنویسی دیگر فوق العاده است. محتوای دوره در edX رایگان است و پلتفرم منبع باز است. در مجموع، اگر به دنبال دوره های کدنویسی با کیفیت بالا برای یادگیری در مورد جدیدترین فناوری ها و تئوری های موجود هستید، edX سایت برنامه نویسی مورد علاقه شما است.
- GeekforGeeks :
در اینجا میتوانید دورههایی را به زبانهای مختلف و همچنین آموزشها و آزمونهایی را بیابید. همچنین میتوانید موضوعات زیادی مانند ساختارهای داده، الگوریتم ها و یادگیری ماشینی را بیاموزید. میتوانید این وب سایت را به عنوان یک دانشگاه آنلاین در نظر بگیرید. شما حتی میتوانید پس از اتمام آموزشها گواهینامه دریافت کنید. علاوه بر این، این وب سایت به شما نکات و ترفندهایی در مورد برنامه نویسی می دهد. به طور خلاصه، GeekforGeeks آموزشهای مختلفی را برای برنامه نویسان مبتدی و پیشرفته ارائه می دهد.
- W3Schools :
W3Schools با ارائه یک تجربه یادگیری ساده و تعاملی، وب سایتی است که آموزشهای رایگان در مورد توسعه وب ارائه میدهد. این آموزشها با نمونههای کد زیادی همراه هستند و در موضوعات و سطح دشواری متفاوت هستند. همچنین دارای یک ویرایشگر کد آنلاین است که در آن افراد میتوانند قبل از اجرای کدهای کامپیوتری، آن را آزمایش کنند.
- FreeCodeCamp :
این وب سایت دارای یک کانال یوتیوب نیز میباشد. ویدیوهای تهیه شده توسط مربیان مختلف بسیار عالی است. در اینجا میتوانید ویدیوهای مربوط به هر زمینه مرتبط با نرمافزار را پیدا کنید. FreeCodeCamp هزاران ساعت چالش کدنویسی دارد. با آموزشهای FreeCodeCamp می توانید به راحتی برنامه نویسی را یاد بگیرید.
- Stack Overflow : در حین کار بر روی یک پروژه، گاهی اوقات با خطاهایی مواجه میشوید. تلاش برای حل این خطاها شما را بهبود میبخشد. هنگام دریافت خطا، در اینترنت جستجو خواهید کرد، Stack Overflow مکانی عالی برای یافتن راه حل مشکل شماست. اگر راه حلی برای مشکل خود نمیبینید، میتوانید اینجا بنویسید. احتمالاً در مدت زمان کوتاهی پاسخ سؤال خود را خواهید یافت. به طور خلاصه، این وب سایت جایی است که توسعه دهندگان سؤال میپرسند یا به آنها پاسخ میدهند. شما همچنین میتوانید با پاسخ دادن به سوالات خود را بهبود بخشید. هر مشکلی که حل میکنید امتیازی برای شما به ارمغان میآورد. با افزایش امتیازات میتوانید راحت تر شغل پیدا کنید. این وب سایت در بین برنامه نویسان بسیار محبوب است.
- YouTube :
یوتیوب قطعا یکی از بهترین وب سایتها برای یادگیری کدنویسی و مهارتهای فنی از ابتدا است. اگر قصد دارید یک برنامهنویس شوید، میتوانید کانالهای YouTube را برای یادگیری برنامه نویسی بدون تجربه قبلی پیدا کنید. با این حال، به یاد داشته باشید که شما واقعاً نحوه کدنویسی را فقط با تماشای کدهای شخص دیگری یاد نخواهید گرفت. کد خود را بدون دنبال کردن ویدیو بنویسید. ببینید تا کجا پیش میروید و فقط در صورت نیاز به کمک به یک آموزش مراجعه کنید. اگر نمی توانید یک پروژه برنامه نویسی را بدون «تقلب» به پایان برسانید، همچنان به تمرین بیشتری نیاز دارید.
چه سوالاتی هنگام مصاحبه شغلی فرانت اند پرسیده می شود؟
سوالاتی که برای استخدام یک برنامه نویس فرانت اند پرسیده میشود میتواند شامل دو دسته سوال عمومی و تخصصی باشد؛ سوالات عمومی مانند موارد زیر
1. وب سایت مورد علاقه شما و دلایل شما برای این انتخاب چیست؟
2. برای طراحی یک وبسایت کاربر پسند باید به چه نکاتی توجه کنیم؟
3. به چه نکاتی در طراحی توجه کنیم که به سئو سایت نیز کمک کند؟
سوالات تخصصی نیز میتواند بصورت زیر پرسیده شود.
تگ های HTML و دستورات CSS چیست، چه کاربردی دارد و چطور می توان به کمک آن ها سایت را واکنشگرا کرد طوری که روی ابعاد مختلف صفحه نمایش درست نشان داده شده و اصطلاحا mobile friendly باشد.
محبوب ترین زبان های برنامه نویسی کدامند؟
رده بندیهای مختلفی برای معرفی محبوب ترین زبانهای برنامه نویسی توسط سازمانهای مختلف ارائه میشود که در اکثر آنها Python، Java، سی شارپ، کاتلین و سوئیفت به چشم میخورد. برای شروع یادگیری یک زبان برنامه نویسی بیشتر از آنکه به رنک آن توجه کنید باید ببینید هدف شما از یادگیری آن زبان برنامه نویسی چیست، زیرا برای برخی از کارها باید زبان برنامه نویسی مناسب آن کار را فرا بگیرید.
بعنوان مثال اگر فردی میخواهد در حوزه یادگیری ماشین فعالیت کند باید به سراغ زبان برنامه نویسی پایتون برود و شخصی که میخواهد در حوزه طراحی سایت کار کند بهتر است به سراغ زبانهای برنامه نویسی مانند جاوا اسکریپت یا لاراول برود.
میانگین درآمد برنامه نویس در ایران چقدر است؟
میانگین درآمد یک برنامه نویس به مهارتها و تواناییهای آن شخص وابسته است؛ حقوق برنامه نویس بسته به تواناییها و سابقه کاری که دارد میتواند از 5 تا 25 میلیون تومان متغیر باشد، البته برنامه نویسان خاصی وجود دارند که درآمدهای بالاتری نیز دارند.
زبان برنامه نویسی پایتون چه کاربردهایی دارد؟
زبان برنامه نویسی پایتون (Python) زبانی چند منظوره و دارای کاربردهای بسیار زیادی است که از جمله آن ها می توان به موارد زیر اشاره کرد:
1- طراحی بک اند یک سایت
2- طراحی و ساخت برنامه های موبایل و دسکتاپ
3- استفاده از پایتون در هوش مصنوعی و یادگیری ماشین
4- استفاده در علم داده
درک چگونگی تبدیل اعداد باینری در مبنای 2 به اعداد دسیمال در مبنای 10 و بطور کلی تبدیل اعداد از مبنایی به مبنای دیگر نیازمند آموزش و مثال تشریحی است که در این مطلب با مثال های گوناگون به آموزش تبدیل مبنای اعداد به یکدیگر می پردازیم.
اعداد باینری و دسیمال؛ نحوه عملکرد مدارهای منطقی
با در نظر گرفتن انواع مدارهای پردازش سیگنال های سیستم که شامل مدارهای غیرخطی، آنالوگ و دیجیتالی هستند، بر خلاف مدارهای آنالوگ و غیرخطی که مسئولیت پردازش سیگنال هایی با دامنه و فرکانس متغیر را بر عهده دارند، مدارهای دیجیتالی سیگنال هایی را پردازش می کنند که فقط دو حالت یا دو سطح ولتاژ دارند و این حالت ها عبارتند از "0 منطقی" و "1 منطقی" . این دو سطح ولتاژ، در مدارهای دیجیتالی و کامپیوتری ارقام باینری نامیده می شوند.
از آنجایی که عناصر مورد استفاده در سیستمهای دیجیتال معمولا 2 حالته هستند، مثلا ترانزیستورهای مورد استفاده در سیستمهای دیجیتال در یکی از دو حالت خاموش یا روشن عمل میکنند، دو رقمی بودن مبنا 2 موجب شده است که این مبنا تناسب بیشتر با ذات سیستمهایِ دیجیتالِ مورد استفاده در دنیای امروز داشته باشد و در طراحی و تحلیل مدارهای منطقی مبنای 2 از اهمیت زیادی برخوردار باشد. برای کسب اطلاعات بیشتر درباره مدار منطقی (Logic Circuit) می توانید به معرفی، بررسی و آموزش مدار منطقی مراجعه کنید.
تمامی سیستم های کامپیوتری و دیجیتالی بر اساس اعداد باینری و دسیمال (مبنای 2 و مبنای 10) کار می کنند؛ بنابراین دانش تبدیل اعداد از مبنای باینری به دسیمال (مبنای 2 به 10) از اهمیت بالایی برخوردار است.
آشنایی با انواع مبنا و نمایش اعداد در مبناهای مختلف
قبل از اینکه بخواهیم به بررسی دقیق و تخصصی تبدیل یک عدد از یک مبنا به یک مبنا دیگر بپردازیم، نیاز است که کمی با نحوه نمایش اعداد آشنا شویم، برای نمایش اعداد میتوان از رشتهای از Symbolها استفاده کرد، که به هر سیمبل یک رقم میگوییم، بعنوان مثال همه افراد عادی، عادت دارند برای بیان و یا نوشتن اعداد از 10 رقم 0 تا 9 استفاده کنند، حال به تعداد سیمبلها (ارقام) برای نمایش یک عدد استفاده میکنیم، مبنای آن عدد گفته میشود.
درست است که انسانها در زندگی روزمره برای بیان و نوشتن اعداد از مبنای 10 (Decimal) استفاده میکنند ولی اگر بخواهیم در حالت کلی تر این موضوع را بررسی کنیم، میتوان برای نمایش اعداد از تعداد ارقامِ بیشتر از 10 یا کمتر از 10 استفاده کرد. بعنوان مثال در مبنای 2 ارقامی که برای بیان، نوشتن و یا نمایش اعداد استفاده میشود 0 و 1 است، در مبنای 8 ارقامی که برای بیان، نوشتن و یا نمایش اعداد استفاده میشود 0، 1، 2، ...، 7 است. وقتی که مبنا اعدادمان بزرگتر از 10 است، معمولا برای نمایش دادن ارقام بعد از 9 از حروف الفبای انگلیسی استفاده میکنند، بعنوان مثال ارقام مورد استفاده برای ساختن اعداد مبنای 16 عبارتند از:
$$ 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F $$
بطور کلی برای نمایش یک عدد در مبنای r از ارقام 0 تا r-1 یعنی r تا رقم استفاده میشود. بطور کلی عدد A در مبنای r را میتوان به صورت زیر نمایش داد:
\[A=\ {(a_{n-1}a_{n-2}...a_1a_0.a_{-1}a_{-2}...a_{-m})}_r\]
در عبارت بالا هر رقم مثل \(a_i\) در مبنای r دارای ارزش \(r^i\) است.
برای تبدیل یک عدد از یک مبنا به یک مبنای دیگر، سه حالت مختلف را در نظر میگیریم که در این قسمت به توضیح این حالتها میپردازیم.
1- تبدیل از مبنای دلخواه r به مبنای 10
تبدیل یک عدد از مبنای r به مبنای 10 معادل به دست آوردن مقدار عددی آن عدد است. در فیلم زیر نحوه تبدیل یک عدد که مبنایی به جز 10 دارد به یک عدد مبنا 10 توضیح داده شده است.
برای اینکه به تبدیل یک عدد از مبناهای غیر از 10 به مبنا 10 مسلط شوید در فیلم زیر مثال های دیگری برای شما عزیزان حل شده است.
اگر بخواهیم تبدیل یک عدد از مبنای دلخواه r به مبنای 10 را بصورت متنی توضیح دهیم خواهیم داشت:
برای این منظور هر رقم را در ارزش آن رقم ضرب میکنیم و مقادیر بدست آمده را با هم جمع میکنیم.
\[A=\ {(a_{n-1}a_{n-2}...a_1a_0.a_{-1}a_{-2}...a_{-m})}_r=\ a_{n-1}\times r^{n-1}+a_{n-2}\times r^{n-2}+...\ +a_0\times r^0+a_{-1}\times r^{-1}+...+a_{-m}\times r^{-m}\]
مثال: عدد \(N = (10100)_{2}\) را به مبنای 10 تبدیل کنید.
\[(\overbrace {1}^{4}\overbrace{0}^{3}\overbrace{1}^{2}\overbrace{0}^{1}\overbrace{0}^{0} )=1\times 2^2+1\times 2^4=4+16=20\]
بنابراین:
$$ (10100)_{2} = (20)_{10} $$
مثال: عدد \(N = (A60)_{16}\) را به مبنای 10 تبدیل کنید.
$$ (A60)_{16} = 10\times 16^2 + 6\times16^1 + 0\times16^0 = 2656 $$
بنابراین:
$$ (A60)_{16} = (2656)_{10} $$
2- تبدیل از مبنای 10 به مبنای r
در فیلم زیر نحوه تبدیل از مبنای 10 به سایر مبنا ها توضیح داده شده است
اگر بخواهیم نحوه تبدیل از مبنای 10 به سایر مبنا ها را بصورت متنی توضیح دهیم خواهیم داشت:
فرض کنید عدد N در مبنای 10 است و میخواهیم این عدد را به مبنای r تبدیل کنیم، فرض کنید این کار را انجام دادهایم بنابراین در نهایت میتوانیم عبارت زیر را بنویسیم:
\[{\left(N\right)}_{10}=\ {\left(b_{n-1}b_{n-2}\dots b_1b_0.b_{-1}b_{-2}\dots b_{-m}\right)}_r\ \Rightarrow {\left(N\right)}_{10}=\ b_{n-1}\times r^{n-1}+b_{n-2}\times r^{n-2}+...\ +b_0\times r^0+b_{-1}\times r^{-1}+...+b_{-m}\times r^{-m}\]
حال اگر بتوانیم از درون عبارت زیر \(b_i\) ها را بدست آوریم در واقع توانستهایم محاسبه کنیم که عدد N در مبنای 10 معادل چه عددی در مبنای r است.
با توجه به صحبتهای بالا میتوانیم قسمت صحیح و اعشار عدد را بصورت جداگانه نیز نشان دهیم، فرض میکنیم بخش صحیح و بخش کسری عدد N به ترتیب برابر باشد با \( N_{I} \) و \( N_{f} \) ، I مخفف Integral یعنی بخش صحیح عدد و f مخفف Fractional یعنی بخش اعشاری عدد است.
\[N_I=\ {\left(b_{n-1}b_{n-2}\dots b_1b_0\right)}_r\ \Rightarrow {\left(N\right)}_I=\ b_{n-1}\times r^{n-1}+b_{n-2}\times r^{n-2}+...\ +b_1\times r^1+b_0\] \[N_f=\ {\left(0.b_{-1}b_{-2}\dots b_{-m}\right)}_r\ \Rightarrow {\left(N\right)}_f=b_{-1}\times r^{-1}+b_{-2}\times r^{-2}+...+b_{-(m-1)}\times r^{-(m-1)}+b_{-m}\times r^{-m}\] \[N=N_I+N_f\]
روش محاسبه \(b_i\) های بخش صحیح عدد و بخش اعشاری عدد متفاوت است، به همین دلیل برای تبدیل عدد N از مبنای 10 به مبنای r ، به صورت زیر عمل میکنیم:
-
برای یافتن معادل قسمت صحیح N باید باید \(b_0\)، \(b_1\)، ... تا \(b_{n-1}\) را بیابیم، حال برای این کار، از تقسیم متوالی بخش صحیح عدد N یعنی \( N_{I} \) به مبنای r استفاده میکنیم:
$$ N_{I} = \{[...(b_{i-1}r + b_{i-2})r + ... + b_{2}]r + b_{1}\}r + b_{0} : 0 \le b_{i} \le r - 1 $$
با توجه به عبارت بالا مشخص است که اگر \( N_{I} \) را بر r تقسیم کنیم، رقم \( b_{0} \) به عنوان باقیمانده و \( (...(b_{i-1}r+b_{i-2})r + b_{1} \) به عنوان خارجقسمت به دست میآید، یعنی با اولین باری که ما عبارت بالا را بر r تقسیم کردیم توانستیم کم ارزش ترین رقم (\( b_{0} \)) صحیح عدد مبنای r معادل با عدد N در مبنای 10 را بدست آوریم. حال با تقسیم خارجقسمت بر r رقم \( b_{1} \) به دست میآید و این کار تا وقتی به خارجقسمتی کوچکتر از r برسیم، به همین شکل ادامه پیدا میکند، با این کار توانستهایم \( b_{i} \) های صحیح را محاسبه کنیم.
-
برای یافتن معادل قسمت اعشاری N باید باید \(b_{-1}\)، \(b_{-2}\)، ... تا \(b_{-m}\) را بیابیم، حال برای این کار، از ضرب متوالی بخش کسری عدد N یعنی \( N_{f} \) در مبنای r استفاده میکنیم:
$$ N_{f} = r^{-1}\{b_{-1}+ r^{-1}[b_{-2}+r^{-1}(b_{-3} + ... )]\} : 0 \le b_{i} \le r - 1 $$
بنابراین اگر \( N_{f} \) را در r ضرب کنیم، رقم \( b_{-1} \) به عنوان بخش صحیح حاصلضرب و \( r^{-1}[b_{-2}+r^{-1}(b_{-3} + ...)] \) به عنوان بخش کسری حاصلضرب به دست میآید. با ضرب بخش کسری حاصل در r رقم \( b_{-2} \) به دست میآید و این کار تا "∘" شدن بخش کسری، به همین شکل ادامه پیدا میکند.
مثال: عدد \( N = (25.625)_{10} \) را به مبنای 2 تبدیل کنید.
تبدیل بخش صحیح: ابتدا عدد 25 را بر 2 تقسیم میکنیم، خارجقسمت برابر 12 و باقیمانده برابر 1 است که این باقیمانده بیت \( b_{0} \) را نشان میدهد. حال 12 را بر 2 تقسیم میکنیم، خارجقسمت برابر 6 و باقیمانده برابر "∘" است که این باقیمانده بیت \( b_{1} \) را نشان میدهد. با تقسیم 6 بر 2 خارجقسمت و باقیمانده به ترتیب برابر 3 و "∘" است که این باقیمانده بیت \( b_{2} \) را نشان میدهد. در نهایت با تقسیم 3 بر 2 به باقیمانده 1 و خارجقسمت 1 میرسیم که به ترتیب بیتهای \( b_{3} \) و \( b_{4} \) را نشان میدهد. بنابراین بخش صحیح عدد برابر است با: \( (11001)_{2} \)
تبدیل بخش کسری: ابتدا عدد 0.625 را در 2 ضرب میکنیم، که حاصل برابر 1.25 میشود. رقم صحیح به دست آمده یعنی 1 اولین بیت پس از ممیز یعنی \( b_{-1} \) را نشان میدهد. با ضرب بخش کسری یعنی 0.25 در 2، حاصل برابر 0.5 میشود که بخش صحیح یعنی "∘" بیت \( b_{-2} \) را نشان میدهد. در نهایت با ضرب بخش کسری 0.5 در 2، بیت \( b_{-3} \) برابر 1 به دست میآید. بنابراین بخش کسری عدد برابر است با: \( (0.101)_{2} \)
روابط زیر این مراحل را نشان میدهد:
0.625×2 = 1.25 0.25×2 = 0.5 0.5×2 = 1.0 |
بنابراین داریم:
$$ (25.625)_{10} = (11001.101)_{2} $$
1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096
تبدیل از مبنای 10 به مبنای 2
به مثال زیر توجه کنید :
عدد \(N = (593)_{10}\) را به مبنای 2 تبدیل کنید.
بزرگترین توان 2 که امکان کم کردن آن از عدد 593 وجود دارد عدد 512 است، سپس میتوان به ترتیب اعداد 64، 16 و 1 را از باقیمانده کم کرد (روابط زیر را ببینید).
593 - 512 = 81
81 - 64 = 17
17 - 16 = 1
1 - 1 = 0
بنابراین در معادل مبنای 2 این عدد در محلهایی به وزن 1، 16، 64 و 512 بیت 1 و در سایر محلها بیت "∘" داریم. یعنی:
$$ (593)_{10} = (1001010001)_{2} $$
مثال: برای نمایش عدد \(N = (345)_{10}\) در مبنای 2 به چند بیت نیاز داریم؟
از آنجا که \(2^8 = 256 \le 345 \lt 2^9 = 512\) برای نمایش این عدد در مبنای 2 به 9 بیت نیاز داریم.
مثال: عدد \(N = (451.5)_{10}\) را به مبنای 16 تبدیل کنید.
روابط زیر مراحل تبدیل را نشان میدهد:
0.5×16 = 8.0 |
بنابراین داریم:
$$ (451.5)_{10} = (1E3.8)_{16} $$
3- تبدیل از مبنای دلخواه \( r_{1} \) به مبنای \( r_{2} \)
برای تبدیل یک عدد از مبنای \( r_{1} \) به مبنای \( r_{2} \) ، ابتدا عدد را از مبنای \( r_{1} \) به مبنای 10 تبدیل کرده و سپس عدد را از مبنای 10 به مبنای \( r_{2} \) تبدیل میکنیم.
مثال: عدد \(N = (23.3)_{5}\) را به مبنای 2 تبدیل کنید.
ابتدا عدد را به مبنای 10 تبدیل میکنیم:
$$ (23.3)_{5} = 2\times5^1 + 3\times5^0 + 3\times5^{-1} = (13.6)_{10} $$
حال عدد 13.6 را به مبنای 2 تبدیل میکنیم:
0.6×2 = 1.2 0.2×2 = 0.4 0.4×2 = 0.8 0.8×2 = 1.6 |
13 - 8 = 5 5 - 4 = 1 1 - 1 = 0 |
بنابراین داریم:
$$ (13.6)_{10} = (1101.\overline{1001})_{2} $$
مثال: فرض کنید عدد N در مبنای \( r_{1} \) با \( n_{1} \) رقم نمایش داده شده است. اگر بخواهیم این عدد را به مبنای \( r_{2} \) تبدیل کنیم، تعداد رقمهای مورد نیاز در مبنای جدید چقدر است؟
تعداد رقمهای مورد نیاز در مبنای مقصد باید به گونهای باشد که بتوان بزرگترین عدد قابل نمایش در مبنای \( r_{1} \) با \( n_{1} \) رقم را در مبنای مقصد نمایش داد. از این رو بزرگترین عدد قابل نمایش با \( n_{1} \) رقم در مبنای مبدأ باید از بزرگترین عدد قابل نمایش در مبنای مقصد کوچکتر باشد، بنابراین اگر فرض کنیم \( n_{2} \) تعداد رقمهای مورد نیاز برای نمایش عدد N در مبنای \( r_{2} \) باشد، باید رابطه \( r_{1}^{n1} - 1 \le r_{2}^{n2} -1 \) برقرار باشد.
$$ r_{1}^{n1} - 1 \le r_{2}^{n2} -1 \Rightarrow n_{1} log r_{1} \le n_{2} log r_{2} \Rightarrow n_{2} \ge n_{1} \frac{logr_{1}}{logr_{2}} \Rightarrow n_{2}\lceil n_{1}\frac{logr_{1}}{logr_{2}}\rceil $$
$$ n_{2}\lceil n_{1}\frac{logr_{1}}{logr_{2}}\rceil $$
مثال: تعداد بیتهای لازم برای نمایش یک عدد 3 رقمی دهدهی در مبنای 2 چیست؟
$$ n_{2}\lceil n_{1}\frac{logr_{1}}{logr_{2}}\rceil = \lceil 3\frac{log10}{log2}\rceil = \lceil 3\frac{1}{0.301}\rceil = 10 $$
مثال: عدد \(N = (01101001101001.010111)_{2}\) را به مبنای 16 تبدیل کنید.
از آنجا که در این مثال \( r_{1}=2 , r_{2}=2^4\) بنابراین 4 = k است.
$$ N = (\underbrace{0001}_{1} \underbrace{1010}_{A} \underbrace{0110}_{6} \underbrace{1001}_{9}.\underbrace{0101}_{5}\underbrace{1100}_{c})_{2} = (1A69.5C)_{16} $$
مثال: عدد \(N = (C41.5A)_{16}\) را به مبنای 2 تبدیل کنید.
از آنجا که در این مثال \( r_{2}=2 , r_{1}=2^4\) بنابراین 4 = k است.
$$ N = ( \underbrace{ C }_{1100} \underbrace{ 4 }_{0100} \underbrace{ 1 }_{0001} . \underbrace{ 5 }_{0101} \underbrace{ A }_{1010} )_{16} = (110001000001.0101101)_{2} $$
سلام به همه شما دانش آموزان و دانشجویان عزیز، به کاملترین صفحهای که برای معرفی و بررسی گراف در وب فارسی وجود داره خوش اومدید 😉
به دلیل اهمیت نظریه گراف در برنامه نویسی، ریاضیات و رشته کامپیوتر، برآن شدیم تا مقاله دیگری با محوریت درسی درباره گراف نوشته تا علاقهمندان به این رشتهها بتوانند از مطالب آن استفاده کنند. ابتداییترین سوالی که در رابطه با گراف پیش میآید این است که معنی گراف چیست؟ واژه گراف در ترجمه تحت الفظی به معنای نمودار است اما با نمودارهای خطی یا میلهای که اغلب ما میشناسیم متفاوت است. گراف ها نوعی از ساختمان داده های غیرخطی هستند و یکی از اصلی ترین ویژگیهای آنها این است که دادههای آنها از یک ترتیب خاص پیروی نمیکنند.
در ادامه به آموزش گراف که از فصول مهم ریاضیات گسستهجامع ترین آموزش درس ریاضی گسستهدرس ریاضیات گسسته به معرفی مباحثی نظیر شمارش و احتمال، استدلال و برهان خلف، نظریه اعداد، منطق ریاضی، روابط بازگشتی، روابط و نظریه گراف میپردازد. از آن رو که در عصر کنونی ریاضی گسسته بطور گسترده در رشته کامپیوتر و برنامه نویسی استفاده میشود در این صفحه به معرفی و بررسی درس ریاضی گسسته پرداخته شده است، ساختمان دادهآموزش ساختمان داده و الگوریتمهر ساختمان داده یک نوع فرمت ذخیرهسازی و مدیریت دادهها در کامپیوتر است، که امکان دسترسی و اصلاح کارآمد آن دادهها را برای یکسری از الگوریتمها و کاربردها فراهم میکند، در این صفحه به بررسی و آموزش ساختمان داده و الگوریتم پرداخته شده است و طراحی الگوریتمآموزش طراحی الگوریتم به زبان سادهدرس طراحی الگوریتم یکی از مهمترین و بنیادیترین دروس رشته کامپیوتر است. هدف از این درس، معرفی روشهای مختلف طراحی الگوریتمها برای حل مسائل گوناگون است، در این صفحه به معرفی و آموزش طراحی الگوریتم پرداخته شده است. بشمار میرود میپردازیم. در مقالهی نظریه گرافهمه چیز در مورد نظریه گراف (Graph Theory)در این مقاله یک مقدمه جامع در رابطه با نظریه گراف ارائه شده است و سعی شده نشان داده شود که دانستن برخی از مبانی نظریه گراف تا چه میزان میتواند مفید و موثر باشد. (Graph Theory) که توسط خانم فدایی، دانشجوی ارشد مهندسی کامپیوتر دانشگاه صنعتی شریف، نوشته شده است، به آشنایی با نظریه گراف، تاریخچه نظریه گراف، انواع گراف، کاربرد گراف و دیگر موارد مهم بطور جامع پرداخته شده است که در صورت علاقهمندی توصیه میشود که مطالعه این مقاله عالی را از دست ندهید.
گراف چیست؟
گراف بعنوان یک شبکه با مجموعهای از نقاط و خطوط شناخته میشود. هر گراف G، شامل دو مجموعه V و E است که:
1) V، مجموعه محدود و غیرتهی از رئوس میباشد.
2) E، مجموعهای محدود (تهی یا غیرتهی) از لبهها (یالها) میباشد.
V(G) و E(G) مجموعه رئوس و لبههای گراف G را نمایش میدهند. بنابراین برای نمایش یک گراف از $\mathrm{G\ =\ }\left(\mathrm{V\ ,\ E}\right)$ استفاده میکنیم.
نتیجه: هر گراف حداقل یک رأس دارد و نمیتواند کاملاً تهی باشد.
یال گراف مدلهای گوناگونی دارد که با توجه به نوع یال، گرافها به دستههای مختلفی تقسیم میشوند.
انواع یال در گراف
یالها در گراف به دو دسته یال جهت دار و یال بی جهت تقسیم میشود.
1 | یال جهتدار | (2,3) | زوج مرتب | |
2 | یال غیرجهتدار | 12={1, 2} | زوج نامرتب |
انواع گراف
حال که فهمیدیم انواع یال گراف چگونه میتواند باشد، میتوان گفت که بر اساس نوع یال ما 3 مدل گراف داریم که در این مقاله به شرح دو مورد از آنها میپردازیم.
- گراف بدون جهت
- گراف جهتدار
- گراف مختلط یا آمیخته
گراف بدون جهت
در یک گراف بدون جهت هر لبه (یال، ضلع) به صورت $\left\{{\mathrm{v}}_{\circ },\ {\mathrm{v}}_{\mathrm{1}}\right\}$ یا $\left\{{\mathrm{v}}_{\mathrm{1}},\ {\mathrm{v}}_{\mathrm{\circ }}\right\}$ نمایش داده میشود که ${\mathrm{v}}_{\circ }$ و ${\mathrm{v}}_{\mathrm{1}}$ دو رأس لبه هستند، ترتیب رئوس در بیان یک لبه مهم نبوده و در حقیقت زوج رئوس، زوج مرتب نیستند. به عبارت بهتر: $\left\{{\mathrm{v}}_{\circ },\ {\mathrm{v}}_{\mathrm{1}}\right\}=\left\{{\mathrm{v}}_{\mathrm{1}},\ {\mathrm{v}}_{\mathrm{\circ }}\right\}$
گراف بدون جهت | لبهها (Edges) | رئوس (Vertex) |
\[\mathrm{E}\left(\mathrm{G}\right)=\left\{\left\{\mathrm{1}\mathrm{\ ,\ }\mathrm{2}\right\},\left\{\mathrm{1}\mathrm{\ ,\ }\mathrm{4}\right\},\left\{\mathrm{2}\mathrm{\ ,\ }\mathrm{3}\right\},\left\{\mathrm{3}\mathrm{\ ,\ }\mathrm{4}\right\}\right\}\] | \[\mathrm{V}\left(\mathrm{G}\right)=\left\{\mathrm{1}\mathrm{\ ,\ }\mathrm{2}\mathrm{\ ,\ }\mathrm{3}\mathrm{\ ,\ }\mathrm{4}\right\}\] |
دقت کنید در نمایش بالا برای لبهها E(G) میتوان: بهجای $\left\{\mathrm{1}\mathrm{\ ,\ }\mathrm{2}\right\}$ از $\left\{\mathrm{2}\mathrm{\ ,\ }\mathrm{1}\right\}$، بهجای $\left\{\mathrm{1}\mathrm{\ ,\ }\mathrm{4}\right\}$ از $\left\{\mathrm{4}\mathrm{\ ,\ }\mathrm{1}\right\}$، بهجای $\left\{\mathrm{2}\mathrm{\ ,\ }\mathrm{3}\right\}$ از $\left\{\mathrm{3}\mathrm{\ ,\ }\mathrm{2}\right\}$ و بهجای $\left\{\mathrm{3}\mathrm{\ ,\ }\mathrm{4}\right\}$ از $\left\{\mathrm{4}\mathrm{\ ,\ }\mathrm{3}\right\}$ استفاده کرد.
گراف جهتدار (Digraph)
در یک گراف جهتدار هر لبه (یال، ضلع) با زوج مرتب $\left({\mathrm{v}}_{\circ },\ {\mathrm{v}}_{\mathrm{1}}\right)$ نمایش داده میشود. که ${\mathrm{v}}_{\circ }$ ابتدای لبه و ${\mathrm{v}}_{\mathrm{1}}$ انتها، هستند. بنابراین $\left({\mathrm{v}}_{\mathrm{1}},\ {\mathrm{v}}_{\mathrm{\circ }}\right)$ و $\left({\mathrm{v}}_{\circ },\ {\mathrm{v}}_{\mathrm{1}}\right)$ دو لبه متفاوت را نمایش میدهند. به عبارت بهتر: \[\left({\mathrm{v}}_{\circ },\ {\mathrm{v}}_{\mathrm{1}}\right)\ \neq \ \left({\mathrm{v}}_{\mathrm{1}},\ {\mathrm{v}}_{\mathrm{\circ }}\right)\]
گراف جهتدار | لبهها (Edges) | رئوس (Vertex) |
\[\mathrm{E}\left(\mathrm{G}\right)=\left\{\mathrm{(}\mathrm{1}\mathrm{\ ,\ }\mathrm{2}\mathrm{\ )\ ,\ (}\mathrm{2}\mathrm{\ ,\ }\mathrm{1}\mathrm{\ )}\ ,\ (\mathrm{2}\mathrm{\ ,\ }\mathrm{3}\mathrm{)}\right\}\] | \[\mathrm{V}\left(\mathrm{G}\right)=\left\{\mathrm{1}\mathrm{\ ,\ }\mathrm{2}\mathrm{\ ,\ }\mathrm{3}\mathrm{\ }\right\}\] |
دقت کنید:
- از این به بعد، گراف جهتدار را "digraph" و گراف بدون جهت را گراف مینامیم.
- برای یک گراف بدون جهت، همواره لبهها یا همان یال ها به صورت خطوط یا منحنیها نمایش داده میشوند.
- برای گراف جهتدار لبهها یا همان یال ها به صورت فلشهایی هستند که از ابتدا به انتها رسم شدهاند.
زیر گراف
هر زیر مجموعه از V (رئوس) و E (لبهها) به عنوان زیر گرافهای G میتوانند در نظر گرفته شوند.
بعضی از زیرگرافهای گراف G | گراف G | ||
همسایگی گراف یا مجاور بودن (Adjacent) در گراف
دو گره V , U را در یک گراف مجاور (همسایه) گوییم هرگاه لبه مستقیمی بین آنها وجود داشته باشد. به عبارت بهتر:
- در گراف بدون جهت : دو گره V , U مجاور (همسایه) هستند هرگاه لبه {U , V} وجود داشته باشد.
- در گراف جهتدار: هرگاه لبه $\mathrm{(\ }\mathrm{U\ ,\ V)}\ $ وجود داشته باشد یعنی یال مستقیمی از U به V وجود دارد، به عبارت بهتر: (U مجاور به رأس V) یا (V مجاور از رأس U) است.
توضیحات | گراف G |
گرههای مجاور به 1 عبارتند از: 4 , 2 گرههای مجاور به 3 عبارتند از: 4 , 2 گرههای مجاور به 2 عبارتند از: 3 , 1 گرههای مجاور به 4 عبارتند از: 3 , 1 |
|
گره 2 مجاور به رأس 3 , 1 است. گره 1 مجاور به رأس 2 است. گره 3 به جایی مجاور نیست. |
گراف کامل (Complete Graph)
یک گراف کامل با n رأس، گرافی است که حداکثر تعداد لبه را دارد.
گراف کامل جهتدار با n رأس | گراف کامل بدون جهت با n رأس |
\[\text{تعداد}\mathrm{\ }\text{لبهها}\mathrm{\ =\ n}\left(\mathrm{n}\mathrm{-}\mathrm{1}\right)\] |
\[\text{تعداد}\mathrm{\ }\text{لبهها}\mathrm{\ =\ }\frac{\mathrm{n}\left(\mathrm{n}\mathrm{-}\mathrm{1}\right)}{\mathrm{2}}\] |
گراف بدون جهت G با n راس کامل است اگر و فقط اگر یکی از شرایط زیر برقرار باشد:
- بین هر دو رأس دلخواه لبه (ضلع) مستقیمی وجود داشته باشد.
- هر دو رأس دلخواه مجاور (همسایه) باشند.
- درجه هر کدام از رئوس $n-1$ باشد.
- تعداد لبهها (اضلاع) $\frac{\mathrm{n}\left(\mathrm{n}\mathrm{-}\mathrm{1}\right)}{\mathrm{2}}$ باشد.
مسیر در گراف (Path Graph)
مسیر: هر مجموعه از لبههای پشت سرهم که دو رأس را به هم متصل میکنند مسیر نامیده میشود.
طول مسیر: تعداد لبههای موجود در مسیر را طول مسیر میگویند.
مسیر ساده: مسیری است که همه رئوس آن به جز احتمالاً اول و آخر، متفاوت است.
حلقه در گراف (سیکل یا چرخه = cycle): مسیر سادهای که اولین و آخرین رأس آن با هم برابر است.
مثال اول: در گراف مقابل چند مسیر ساده به طول 2 قرار دارد؟
- 0
- 1
- 4
- 3
حل: گزینه 3 درست است.
(cycle) 1-3-1
(cycle) 3-1-3
2-3-1
2-1-3
مثال دوم: در گراف مقابل چند مسیر ساده به طول 3 قرار دارد؟
- 0
- 1
- 4
- 3
حل: گزینه 4 درست است.
(cycle) 1-3-2-1
(cycle) 2-1-3-2
(cycle) 3-2-1-3
مثال سوم: اگر b , a دو گره در یک گراف بدون جهت G باشند و اگر دو مسیر 1P , 2P از a به b وجود داشته باشد، آنگاه:
- b , a مجاورند.
- G نمیتواند یک گراف باشد.
- G دارای چرخه است.
- احتیاج به جهت مسیر داریم.
حل: گزینه 3 درست است.
دو گره b , a زمانی مجاورند هرگاه لبه مستقیمی (مسیری به طول 1) بین آنها وجود داشته باشد. هرگاه بین دو رأس بیش از یک مسیر وجود داشته باشد آنگاه حتماً در گراف چرخه وجود دارد.
سیکل (cycle) روی رأس V: به تمام مسیرهای ساده که با رأس v شروع شده و به رأس v ختم شود:
path: v, …, v
مثال: تمام سیکلها روی رأس v1 عبارتند از:
- v1-v2-v1
- v1-v2-v4-v1
- v1-v2-v3-v1
- v1-v2-v3-v4-v1
رئوس متصل (همبند) در گراف
در گراف بدون جهت دو رأس دلخواه ${\mathrm{v}}_{\mathrm{j}}\mathrm{\ ,\ }{\mathrm{v}}_{\mathrm{i}}$ را متصل میگوییم اگر مسیری از ${\mathrm{v}}_{\mathrm{i}}$ به ${\mathrm{v}}_{\mathrm{j}}$ و یا بالعکس وجود داشته باشد.
گراف همبند (متصل)
گراف بدون جهت را گراف متصل یا گراف همبند گوییم اگر برای هر دو رأس ${\mathrm{v}}_{\mathrm{i}}$ و ${\mathrm{v}}_{\mathrm{j}}$ مسیری از ${\mathrm{v}}_{\mathrm{i}}$ به ${\mathrm{v}}_{\mathrm{j}}$ و یا بالعکس وجود داشته باشد.
گراف متصل بدون چرخه (سیکل)
گراف متصل با چرخه (سیکل)
گراف غیرمتصل
یادآوری: هر درخت یک گراف همبند (متصل) بدون دور یا حلقه است.
مولفه همبندی
یک مؤلفه اتصال یا بهطور سادهتر یک مؤلفه در گراف بدون جهت بزرگترین زیرگراف همبند در آن گراف است.
توضیحات | گراف بدون جهت G |
G1 یک مؤلفه از گراف G است. | |
G1 , G2 دو مؤلفه از گراف G هستند. | |
G1 , G2 , G3 سه مؤلفه از گراف G هستند. |
گراف همبند قوی (کاملا متصل)
یک گراف جهتدار کاملاً متصل نامیده میشود هرگاه برای هر زوج رأس ${\mathrm{v}}_{\mathrm{i}}$ و ${\mathrm{v}}_{\mathrm{j}}$ مسیری جهتدار از ${\mathrm{v}}_{\mathrm{i}}$ به ${\mathrm{v}}_{\mathrm{j}}$ و همچنین از ${\mathrm{v}}_{\mathrm{j}}$ به ${\mathrm{v}}_{\mathrm{i}}$ وجود داشته باشد.
G1 | G2 | G3 |
(گراف کاملاً متصل است) (همبند قوی) |
(گراف کاملاً متصل است) |
(گراف کاملاً متصل نیست) (همبند ضعیف) |
مولفه های قویا همبند گراف
یک مؤلفه کاملاً متصل (قویا همبند) بزرگ ترین زیر گراف کاملاً متصل در گراف جهتدار است.
توضیحات | گراف جهتدار G |
G1 , G2 , G3 سه مؤلفه کاملاً متصل (قوی) از گراف G هستند. | |
G1 , G2 دو مؤلفه کاملاً متصل (قوی) از گراف G هستند. | |
G1 یک مؤلفه کاملاً متصل (قوی) از گراف G نیست. |
درجه گراف (Graph degree)
قبل از بیان درجه گراف ابتدا میبایست نحوه محاسبه درجه هر راس در انواع گراف مورد بررسی قرار گیرد تا با آن آشنا شوید.
درجه گراف غیر جهت دار
درجه یک راس از گراف بدون جهت تعداد لبهها یا یالهای متلاقی با آن رأس است. به عبارت بهتر درجه هر رأس از گراف تعداد گرههای مجاور به رأس را نشان میدهد.
درجه گراف جهت دار
در هر گراف جهتدار درجه یک رأس برابر است با: (درجه وارده + درجه خارجه) که:
- درجه ورودی (وارده): تعداد یالهایی که به رأس وارد میشوند.
- درجه خروجی (خارجه): تعداد یالهایی که از رأس خارج میشوند.
گرههای چاه و منبع:
- گره چاه: به گرهای که درجه خروجی آن در گراف جهتدار باشد.
- گره منبع: به گرهای که درجه ورودی آن در گراف جهتدار باشد.
درجه گراف:
درجه هر گراف برابر با بزرگترین درجه گرههای آن گراف است.
دقت کنید اگر درجه رأسی فرد باشد آن رأس را راس فرد گویند و اگر زوج باشد آن رأس را راس زوج گویند. تعداد رأسهای فرد یک گراف غیرجهتدار همواره عددی زوج است.
تعداد یال ها و درجه هر راس گراف
اگر در گراف G (جهتدار یا بدون جهت) با n رأس، ${\mathrm{d}}_{\mathrm{i}}$ درجه رأس i و e تعداد لبهها باشد تعداد لبههای گراف برابر است با:
\[\mathrm{e\ =\ }\frac{\left(\sum^{\mathrm{n}}_{\mathrm{i\ =\ }\mathrm{1}}{{\mathrm{d}}_{\mathrm{i}}}\right)}{\mathrm{2}}\mathrm{\ \ \ \ \ \ \ \ \ \ \ \ }{{\stackrel{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }{\longrightarrow}}}\ \ \ \ \ \ \ \ \ \ تعداد\mathrm{\ }لبهها\mathrm{\ (}یالها\mathrm{)}\mathrm{\ =\ }\frac{\mathrm{\ \ \ }مجموع\mathrm{\ }درجه\mathrm{\ }رئوس\mathrm{\ \ \ }}{\mathrm{2}}\]
تعداد لبهها (یالها، اضلاع) | گراف G |
\[\mathrm{e\ =\ }\frac{\sum{{\mathrm{d}}_{\mathrm{i}}}}{\mathrm{2}}=\frac{\mathrm{1}\mathrm{\ +\ }\mathrm{2}\mathrm{\ +\ }\mathrm{2}\mathrm{\ +\ }\mathrm{1}}{\mathrm{2}}=\mathrm{3}\] | |
\[\mathrm{e\ =\ }\frac{\sum{{\mathrm{d}}_{\mathrm{i}}}}{\mathrm{2}}=\frac{\mathrm{3}\mathrm{\ +\ }\mathrm{3}\mathrm{\ +\ }\mathrm{2}\mathrm{\ }}{\mathrm{2}}=\mathrm{4}\] |
گراف مکمل (Complement Graph)
در صورتی که G یک گراف دلخواه باشد، گراف مکمل G گرافی است که هیچ یال مشترکی با آن نداشته و مجموع دو گراف یک گراف کامل (Complete) را تشکیل میدهند بهطور مثال:
گراف کامل | گراف مکمل G | گراف G |
گراف منتظم
گرافی که درجه همه رئوس آن برابر باشد، گراف منتظم نامیده میشود. به عنوان مثال گرافهای زیر نمایشی از گراف دو منتظم با تعداد رئوس متفاوت است.
گراف اویلری
قبل از پرداختن به بحث گراف اویلری و خواص آن، به تعریف چند اصطلاح پرکاربرد در گراف میپردازیم:
- گشت (Walk): به دنبالهای از رئوس گراف گشت گفته میشود.
- گذر (Trail): دنبالهای از رئوس گراف که یال تکراری ندارد. اگر راس شروع و پایان گذر یکی باشد به آن مدار (Circuit) میگویند.
- مسیر (Path): دنبالهای از رئوس گراف که راس تکراری ندارد. اگر راس شروع و پایان یکسان باشد به آن دور یا سیکل (Cycle) میگویند.
گذر اویلری
گذری در گراف که همه یالها را طی کند (در گذر یال تکراری نداشتیم) گذر اویلری نام دارد. به شکل زیر توجه کنید.
در این گراف، گذر bcdbad یک گذر اویلری از گراف است. همانطور که مشخص است این گذر از یال تکراری عبور نکرده است.
مدار اویلری
مداری در گراف که همه یالها را طی کند (در مدار یال تکراری نداشتیم) مدار اویلری نام دارد. گرافی که مدار اویلری داشته باشد را گراف اویلری میگویند.
قضیه: شرط لازم و کافی برای وجود مدار اویلری در یک گراف غیرجهتدار، آن است که اولاً گراف همبندی باشد و ثانیاً درجه همه رئوس زوج باشد.
اگر گراف غیرجهت دار همبند دارای مدار اویلری باشد چگونه میتوان گفت که درجه همه رئوس زوج است؟
به دلیل همبند بودن گراف، به هر راس در گراف حداقل یک یال متصل شده است که قصد داریم از آن یال دقیقا یکبار گذر کنیم. با عبور از یک یال، به یک راس میرسیم و باید از آن راس نیز توسط یال دیگری که قبلا طی نشده خروج کنیم. و این یعنی به ازای هر یالی که به وسیله آن به یک راس میرسیم، باید یال دیگری متصل به آن راس وجود داشته باشد تا به وسیله آن از آن راس خارج شویم. در نتیجه به هر راس باید تعدادی جفت یال متصل شده باشد تا بتوان از هر یال یکبار عبور کرد. در نتیجه درجه هر راس باید زوج باشد.
قضیه: شرط لازم و کافی برای وجود گذر اویلری در یک گراف غیرجهتدار، آن است که اولاً گراف همبند باشد و ثانیاً یا هیچ راس درجه فردی نداشته باشیم و یا دقیقا دو راس درجه فرد داشته باشیم.
یافتن گذر اویلری محدودیت کمتری نسبت به یافتن مدار اویلری برای ما ایجاد میکند زیرا دیگر نیازی نیست به راس اولیه باز گردیم. در نتیجه اگر تنها دو راس درجه فرد وجود داشته باشد، چون دو راس وجود دارد که دقیقا به ازای هر یالی که به آن وارد میشود، ممکن است یال غیرتکراری دیگری برای خروج از آن راس وجود نداشته باشد در نتیجه برای یافتن گذر اویلری در چنین گرافهایی باید از راس درجه فرد پیمایش را آغاز کنیم و سعی کنیم تا در انتها به راس درجهی فرد دیگری برسیم.
با توجه به استدلالات بیان شده برای گذر و مدار اویلری در گراف غیرجهت دار همبند، میتوان برای گراف جهت دار همبند به صورت زیر استدلال کرد:
قضیه: شرط لازم و کافی برای وجود مدار اویلری در گراف جهتدار آن است که گراف همبند باشد و هر راسی، درجه ورودش با درجه خروجش برابر باشد.
قضیه: شرط لازم و کافی برای وجود گذر اویلری در گراف جهتدار آن است که گراف همبند باشد و هر راسی، درجه ورودش با درجه خروجش برابر باشد به جز احتمالا دو راس $V_1 $ و $V_2 $ که باید به صورت زیر باشند:
indeg($V_1$) = outdeg($V_1$) + 1
outdeg($V_2$) = indeg($V_2$) + 1
در این صورت از راسی شروع میکنیم که درجه خروجیاش یکی بیشتر از درجه ورودیش است و در آخر نیز وارد راسی میشویم که درجه ورودش یکی بیشتر از خروجش باشد.
درخت پوشا (Spanning Tree)
یادآوری: میدانیم که در یک گراف دلخواه با n راس تعداد یالهای آن بزرگتر مساوی 0 و کوچکتر مساوی $\frac{\mathrm{n}\left(\mathrm{n}\mathrm{-}\mathrm{1}\right)}{\mathrm{2}}$ است که این حالت که یالها ماکزیمم است برای زمانی اتفاق میافتد که همه یالهای گراف رسم شده باشد و در واقع گراف کامل باشد. حال اگر گراف اولیه همبند باشد آنگاه حداکثر تعداد یال با حالت قبلی فرقی نمیکند اما حداقل تعداد یال برابر با n-1 است، در واقع یک گراف با n راس باید حداقل n-1 یال داشته باشد تا همبند باشد اگر نه همبند نخواهد بود. برای درک بیشتر شما خوانندگان عزیز این نکات در عکسهای زیر نیز آورده شده است.
\[≤\frac{\mathrm{n}\left(\mathrm{n}\mathrm{-}\mathrm{1}\right)}{\mathrm{2}}\] | تعداد یالها (لبههای) گراف دلخواه با n رأس |
\[\mathrm{\circ }\mathrm{\le }\] |
گراف کامل |
گراف بدون لبه |
\[≤\frac{\mathrm{n}\left(\mathrm{n}\mathrm{-}\mathrm{1}\right)}{\mathrm{2}}\] | تعداد یالها (لبههای) گراف متصل (همبند) با n رأس |
\[\mathrm{n}\mathrm{-}\mathrm{1}\mathrm{\le }\] |
گراف کامل |
درخت پوشا |
هر گراف همبند (متصل) با حداقل لبهی (1- n) را درخت پوشا (Spanning Tree) نامیده میشود. به عبارت بهتر:
- در صورتی که G یک گراف همبند با n رأس باشد، حداقل 1- n لبه دارد.
- درخت پوشا در گراف همبند، درختی است که n رأس گراف را داشته و دقیقاً 1- n لبه (یال) را اختیار میکند.
قضیه: برای گراف بدون جهت G با n رأس، موارد زیر یکسان و معادل هستند:
- G یک درخت میباشد.
- G همبند میباشد، اما اگر هر یک از لبهها حذف گردد، گراف حاصل متصل نمیباشد. (هر یال، پل است.)
- برای هر رأس مجزا مانند $\mathrm{u\ }\mathrm{\in }\mathrm{\ V}\left(\mathrm{G}\right)$ و $\mathrm{v\ }\mathrm{\in }\mathrm{\ V}\left(\mathrm{G}\right)$ تنها یک مسیر ساده از u به v وجود دارد.
- G فاقد حلقه بوده و دارای 1- n لبه میباشد.
- اگر T یک درخت پوشا برای G باشد، آنگاه اضافه کردن یک لبه موجب ایجاد یک حلقه منحصر به فرد میگردد.
قضیه: در گراف کامل با n رأس، تعداد درختان پوشا برابر با ${\mathrm{n}}^{\mathrm{n}\mathrm{-}\mathrm{2}}$ است.
بهطور مثال در گراف کامل با 3=n رأس تعداد ${\mathrm{n}}^{\mathrm{n}\mathrm{-}\mathrm{2}}\mathrm{=}{\mathrm{3}}^{\mathrm{3}\mathrm{-}\mathrm{2}}=\mathrm{3}$ درخت پوشا با 2 = 1- n لبه به صورت زیر وجود دارد:
گراف کامل با 3 = n | درختان پوشا با 2 = 1- n لبه |
مثال: در یک گراف کامل با 10 رأس چند یال را کم کنیم تا به درخت پوشا برسیم؟
- 45
- 36
- 9
- 10
حل: گزینه 2 درست است.
تعداد یالهای یک گراف کامل با n رأس (پیشفرض بدون جهت):
\[تعداد\mathrm{\ }یالها\mathrm{\ =\ }\frac{\mathrm{n}\left(\mathrm{n}\mathrm{-}\mathrm{1}\right)}{\mathrm{2}}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ تعداد\mathrm{\ }یالها\mathrm{\ =\ }\frac{\mathrm{10}\mathrm{\ \times \ }\mathrm{9}}{\mathrm{2}}=\mathrm{45}\]
10 = n
در یک درخت پوشا از یک گراف با n رأس 1- n یال وجود دارد، در نتیجه در گراف با 10 رأس درخت پوشا 9 یال دارد. بنابراین 36 = 9 - 45 یال باید کم شود.
قضیه: در یک گراف کامل با n رأس تعداد مسیرهای بین دو رأس مشخص برابر است با:
\[\sum^{\mathrm{n}\mathrm{-}\mathrm{2}}_{\mathrm{i\ =\ }\mathrm{\circ }}{\mathrm{i!}\left( \begin{array}{c} \mathrm{n}\mathrm{-}\mathrm{2} \\ \mathrm{i} \end{array} \right)}\]
یا به عبارت دیگر:
\[\sum^{\mathrm{n}\mathrm{-}\mathrm{2}}_{\mathrm{i\ =\ }\mathrm{\circ }}{{\mathrm{P}}^{\mathrm{n}\mathrm{-}\mathrm{i}\mathrm{-}\mathrm{1}}_{\mathrm{n}\mathrm{-}\mathrm{2}}}\]
قضیه: در گراف کامل با n رأس، تعداد مسیرها به طول r برابر است با:
\[\frac{\left(\mathrm{n}\mathrm{-}\mathrm{2}\right)!}{\left(\mathrm{n}\mathrm{-}\left(\mathrm{r\ +\ }\mathrm{1}\right)\right)\mathrm{!}}\mathrm{=}{\mathrm{P}}^{\mathrm{n}\mathrm{-}\left(\mathrm{r\ +\ }\mathrm{1}\right)}_{\mathrm{n}\mathrm{-}\mathrm{2}}\]
قضیه: در گراف کامل با n رأس، حداکثر تعداد مسیرهای بین رئوس برابر $\mathrm{O}\left(\left(\mathrm{n}\mathrm{-}\mathrm{1}\right)!\right)$
بهطور مثال در گراف کامل روبهرو مسیرهای بین دو رأس 1 و 2 عبارتست از: path2: 2-3-1, path1: 1-2
یعنی برای 3 = n رأس از این گراف کامل حداکثر $\mathrm{2}\mathrm{\ =}\left(\mathrm{3}\mathrm{-}\mathrm{1}\right)\mathrm{!}$ مسیر بین رئوس وجود دارد.
گراف مسطح (Planar)
گراف مسطح به گرافی گفته میشود که بتوان آن را در صفحه، بهنحوی کشید که یالهایش یکدیگر را قطع نکنند. به عنوان مثال گراف سمت چپ زیر را در نظر بگیرید. میتوان این گراف را بهصورت شکل سمت راست کشید بطوریکه یالهایش یکدیگر را قطع نکنند.
اما سوال مهمی که در این قسمت مطرح میشود، نحوه تشخیص گراف مسطح از گراف غیر مسطح است. اولین راهکاری که به ذهن میرسد این است که ببینیم آیا میتوان گراف داده شده را طوری کشید که یالهایش یکدیگر را قطع نکنند یا نه. در ادامه قضایایی نیز وجود دارند که در این راه به ما کمک خواهند کرد اما قبل از آن میبایست برخی از اصطلاحاتی که در این بخش برای گراف مسطح وجود دارد را معرفی کنیم سپس به سراغ قضایا برویم.
- ناحیه: به سطوحی از صفحه که توسط یالهای گراف مسطح از یکدیگر کاملاً جدا شدهاند. تعداد نواحی را معمولا با r نمایش میدهند.
- درجه هر ناحیه: برای هر ناحیه درجه تعریف میشود و تعداد یالهای مرزی هر ناحیه را درجه آن ناحیه میگویند.
مثال: گراف زیر را در نظر بگیرید. آیا این گراف مسطح است؟ در صورت مسطح بودن این گراف، چه تعداد ناحیه، گره و یال وجود دارد؟
برای پاسخ به این سوال ابتدا باید مسطح بودن گراف داده شده را بررسی کنیم. گراف فوق را میتوان بهصورت زیر رسم کرد. در نتیجه مسطح است.
این گراف دارای 8 گره، 12 یال و 6 ناحیه به شرح زیر است.
مثال: آیا مسطح است؟
در نتیجه مسطح نیست.
مثال: آیا مسطح است؟
با این قضیه نتوانستیم نشان دهیم که مسطح نیست!
قضیه: در گرافهای همبند، ساده و مسطح که است و سیکل به طول 3 ندارد آنگاه
وقتی در یک گراف همبند و ساده، سیکل به طول 3 نداریم یعنی
در نتیجه:
مثال: آیا مسطح است؟
در نتیجه مسطح نیست.
نکته: میدانستیم که گرافهای دو بخشی، سیکل به طول فرد ندارند، بنابراین کوچکترین سیکل آنها بزرگتر مساوی 4 است. از این رو میتوان نتیجه گرفت که در گرافهای دو بخشی
تقسیم مبنا در گراف
مفهوم تقسیم مبنا در گراف بدین معناست که وسط یک یال در گراف یک راس قرار دهیم. در مثال زیر با قرار دادن گرههای x1 و x2 (تقسیم مبنا) یک گراف یا تعداد راس 3 را به یک گراف با تعداد راس 5 تبدیل کردیم.
نکته مهم در خصوص تقسیم مبنا این است که عملیات تقسیم مبنا باعث تغییر درجات رئوس نمیشود. تنها تعدادی راس درجه 2 به گراف اضافه میکند.
در ادامه پس از بیان توضیحاتی در خصوص تقسیم مبنا در گراف، به تعریف 2 مفهوم مهم میپردازیم:
- ایزومورف یا یکریخت: اگر دو گراف از نظر تمام خواص یکسان باشند میگوییم این دو گراف، ایزومورف هستند.
- همومورفیک یا همریخت: اگر 2 گراف داشته باشیم و بتوانیم با تقسیم مبنا از یکی از گرافها به دیگری رسید میگوییم آن دو گراف، همومورفیک هستند.
حال با بیان مفاهیم فوق قضیه مهمی را در خصوص تشخیص مسطح نبودن یک گراف بیان میکنیم:
قضیهی کورتافسکی: گراف G مسطح نیست اگر و تنها اگر دارای زیر گرافی باشد همریخت با و
نمایش گراف (ذخیر سازی گراف در کامپیوتر)
بهطور کلی روشهای زیر برای نمایش گراف ها استفاده میشود:
- ماتریس مجاورتی
- لیست مجاورتی (همجواری)
- لیست مجاورتی معکوس
ماتریس مجاورتی (Adjacent Matrix)
فرض کنید G(V , E) گرافی با n رأس باشد، ماتریس مجاورتی گراف G یک آرایه دو بعدی است به صورت n $\mathrm{\times}$ n که ${\mathrm{n}}^{\mathrm{2}}$ خانه دارد و به صورت زیر پیادهسازی میشود:
ماتریس مجاورتی گراف بدون جهت
در صورتی که لبه یا یالی به صورت $\left\{{\mathrm{v}}_{\mathrm{i}}\mathrm{\ ,\ }{\mathrm{v}}_{\mathrm{j}}\right\}$ وجود داشته باشد $\mathrm{A}\left[\mathrm{i}\right]\left[\mathrm{j}\right]=\mathrm{1}$ است در غیر این صورت $\mathrm{A}\left[\mathrm{i}\right]\left[\mathrm{j}\right]=\mathrm{\circ }$ است.
مشخصات ماتریس مجاورتی گراف بدون جهت:
- ماتریس مجاورتی برای یک گراف بدون جهت همواره نسبت به قطر اصلی گراف متقارن است، بنابراین میتوانیم تنها مثلث بالایی یا پایینی را ذخیره کنیم.
- تعداد 1های ماتریس همواره 2 برابر تعداد یالها (لبهها) میباشد.
- مجموع عناصر سطری یا ستونی برای هر رأس درجه آن را نشان میدهد.
ماتریس مجاورتی گراف جهت دار
مشخصات ماتریس مجاورتی گراف جهتدار:
- ماتریس مجاورتی برای یک گراف جهتدار همواره متقارن نیست بنابراین باید تمام خانههای ماتریس (n2 خانه) را ذخیره کرد.
- تعداد 1های ماتریس برابر با تعداد یالها (لبهها) میباشد.
- برای هر رأس همواره:
مجموع عناصر ستونی هر رأس = درجه ورودی رأس (indegree)
مجموع عناصر سطری هر رأس = درجه خروجی رأس (outdegree)
دقت کنید اگر ماتریس مجاورتی یک گراف جهتدار، ماتریس بالا مثلثی یا پایین مثلثی باشد، (صرف نظر از مقدار درایههای قطر اصلی) آن گراف الزاماً گراف بدون دور یا Acyclic است زیرا اگر قرار بود دوری داشته باشد میبایست یک مسیر برگشت به ازای یکی از مسیرهایی واقع در ماتریس بالا مثلثی وجود میداشت، یعنی یک مسیر در پایین ماتریس (زیر مثلث بالایی)، اما در این صورت دیگر آن ماتریس، ماتریس بالا مثلثی نمیشد.
توجه داشته باشید که هر گراف جهتدار بدون دوری، الزاماً دارای ماتریس مجاورتی بالا مثلثی یا پایین مثلثی نمیباشد.
مثال:
\[ماتریس\mathrm{\ }مجاورتی\mathrm{\ :\ } \begin{array}{c} \mathrm{\ } \\ \mathrm{1} \\ \begin{array}{c} \mathrm{2} \\ \mathrm{3} \end{array} \end{array} \begin{array}{c} \begin{array}{ccc} \mathrm{1} & \mathrm{2} & \mathrm{3} \end{array} \\ \left[ \begin{array}{ccc} \mathrm{\ }\mathrm{\circ } & \mathrm{1} & \mathrm{\circ }\mathrm{\ } \\ \mathrm{\ }\mathrm{\circ } & \mathrm{\circ } & \mathrm{\circ }\mathrm{\ } \\ \mathrm{\ }\mathrm{\circ } & \mathrm{1} & \mathrm{\circ }\mathrm{\ } \end{array} \right] \end{array} \mathrm{\ }\]
در واقع میتوان گفت:
- بالا مثلثی یا پایین مثلثی بودن ماتریس مجاورتی یک گراف شرط کافی برای (Acyclic) بودن آن است؛ اما شرط لازم نیست.
- (Acyclic) بودن یک گراف شرط لازم برای بالا مثلثی یا پایین مثلثی بودن ماتریس مجاورتی آن است؛ اما شرط کافی نیست.
یادآوری: گراف بدون سیکل (Acyclic) گرافی است که در آن هیچ سیکلی وجود ندارد.
نکات مهم ماتریس مجاورتی
-
از نقاط قوت ماتریس مجاورتی این است که سرعت عملیات دسترسی به این که آیا دو گره i و j مجاور هم هستند یا نه؟ (لبه مستقیمی از i به j وجود دارد یا خیر) از مرتبه (1)O است.
if (A[i][j] = 1) then
(i , j) is adj
else
(i , j) is not adj
- اغلب الگوریتمها با استفاده از ماتریس مجاورتی با زمان $\mathrm{O}\left({\mathrm{n}}^{\mathrm{2}}\right)=\mathrm{O}\left({\left|\mathrm{V}\right|}^{\mathrm{2}}\right)$ به دست میآیند.
- برای گراف اسپارس (گراف خلوت) یعنی گرافی که دارای تعداد کمی یال هست زمان لازم O(n + e) است. البته به شرطی که $\mathrm{e\ }\frac{{\mathrm{n}}^{\mathrm{2}}}{\mathrm{2}}$ باشد.
گراف اسپارس (گراف خلوت)
به گرافهایی که تعداد یال کمی داشته $\left(\mathrm{e\ \lt\lt}{\mathrm{n}}^{\mathrm{2}}/\mathrm{2}\right)$ و در نتیجه اکثر عناصر در ماتریس مجاورتی آنها صفر میباشد، گراف اسپارس با گراف خلوت گفته میشود. در این وضعیت میتوانیم زمان لازم برای تست موقعیتها در ماتریس مجاورتی را از زمان $\mathrm{O}\left({\mathrm{n}}^{\mathrm{2}}\right)=\mathrm{O}\left({\left|\mathrm{V}\right|}^{\mathrm{2}}\right)$ به کمک نمایش لیست مجاورتی (ترتیبی یا پیوندی) به زمان $\mathrm{O}\left(\mathrm{n\ +\ e}\right)=\mathrm{O}\left(\left|\mathrm{V}\right|+\left|\mathrm{E}\right|\right)$ کاهش دهیم.
توان k ام از ماتریس مجاورتی
در صورتی که A ماتریس مجاورتی گراف G باشد، آنگاه خانه [i , j] در ماتریس ${\mathrm{A}}^{\mathrm{k}}$، تعداد مسیرها به طول k از رأس i به رأس j را نشان میدهد.
لیست مجاورتی (Adjacent List)
با این نمایش، n سطر ماتریس مجاورتی در n لیست پیوندی قرار میگیرند. برای هر رأس مانند v از گراف G به عنوان Head، یک لیست وجود دارد و هر لیست، حاوی رئوس مجاور از آن رأس میباشد.
لیست مجاورتی گراف بدون جهت
در این وضعیت برای یک گراف با n رأس و e لبه (یال) برای نمایش لیست مجاورتی به n گره Head و 2e گره لیست احتیاج داریم.
گراف بدون جهت G | لیست مجاورتی |
دقت کنید که درجه هر گره (تعداد گره مجاور) در لیست مجاورتی گراف بدون جهت همان تعداد گرههای لیست آن رأس میباشد.
اگر تعداد رئوس گراف G برابر با n باشد، تعداد کل لبهها، در زمان $\mathrm{O}\left(\mathrm{n\ +\ e}\right)=\mathrm{O}\left(\left|\mathrm{V}\right|+\left|\mathrm{E}\right|\right)$ تعیین میشود.
لیست مجاورتی گراف جهت دار
در این وضعیت برای گراف جهتدار با n رأس و e لبه (یال) لیست مجاورتی احتیاج به n گره Head و e گره لیست دارد.
گراف جهتدار G | لیست مجاورتی |
دقت کنید که برای یک گراف جهتدار، درجه خروجی هر رأس با شمارش تعداد گرهها در لیست مجاورتی آن گره به دست میآید این بدین معناست که میتوانیم تعداد کل خطوط یک گراف جهتدار را در زمان $\mathrm{O}\left(\mathrm{n\ +\ e}\right)=\mathrm{O}\left(\left|\mathrm{V}\right|+\left|\mathrm{E}\right|\right)$ تعیین کنیم.
لیست مجاورتی معکوس
در لیست مجاورتی به راحتی میتوانیم درجه خروجی هر رأس را به دست آوریم که همان تعداد گرههای لیست هر گرهی Head میباشد. برای پیدا کردن درجهی ورودی به راحتی نمیتوانیم عمل کنیم. چون باید تمام گرههای Head را جستجو کنیم به غیر از گرهای که میخواهیم درجهی ورودی آن را به دست آوریم. برای آن که به راحتی بتوانیم این کار را انجام دهیم میتوانیم از لیست مجاورتی معکوس استفاده کنیم که در این وضعیت باز هم n گره Head داریم.
گراف جهتدار G | لیست مجاورتی معکوس |
دقت کنید که در هر لیست مجاورتی معکوس، تعداد گرههای لیست درجهی ورودی آن گره را نشان میدهند.
پیمایش گراف
پیمایش به این معناست که همه رئوس گراف را یکبار ملاقات کنیم. بهطور کلی پیمایش گرافهای همبند (متصل) منجر به تولید درخت پوشا (Spanning Tree) با n رأس و 1- n لبه میشود.
انواع پیمایش:
- پیمایش سطحی (BFS) به کمک ساختار صف
- پیمایش عمقی (DFS) به کمک ساختار پشته
مرتبه اجرایی پیمایش گراف
اگر گراف G توسط ماتریس مجاورتی ارائه شود، آنگاه زمان لازم برای پیمایش DFS یا BFS برابر با $\mathrm{O}\left({\mathrm{n}}^{\mathrm{2}}\right)=\mathrm{O}\left({\left|\mathrm{V}\right|}^{\mathrm{2}}\right)$ است.
اگر گراف G توسط لیست مجاورتی ارائه شود، آنگاه زمان لازم برای پیمایش DFS یا BFS برابر با $\mathrm{O}\left(\mathrm{e}\right)=\mathrm{O}\left(\left|\mathrm{E}\right|\right)$ است.
دقت کنید از آنجایی که در هر گراف همبند، $\mathrm{n}\mathrm{-}\mathrm{1}\mathrm{\ }\mathrm{\le }\mathrm{\ e\ }\mathrm{\le }\mathrm{\ n}\left(\mathrm{n}\mathrm{-}\mathrm{1}\right)/\mathrm{2}$ است بنابراین تقریباً $\mathrm{e\ >\ n}$ بوده و میتوان O(e) = O(n + e) و $\mathrm{O}\left(\left|\mathrm{E}\right|\right)=\mathrm{O}\left(\left|\mathrm{E}\right|+\left|\mathrm{V}\right|\right)$ در نظر گرفت.
پیمایش سطح اول یا اول سطح (Breath First Search = BFS)
قاعده این نوع پیمایش گراف به صورت زیر است:
- رأس شروع را انتخاب کرده و ملاقات میکنیم (پیشفرض رأس 0)
- برای هر رأس ملاقاتشده، تمام رئوس مجاور (همسایه) به آن را که تا به حال ملاقات نشدهاند، ملاقات میکنیم.
- عملیات 2 را تا زمانی که همه رئوس یکبار ملاقات شوند ادامه میدهیم.
دقت کنید هرگاه برای یک رأس ملاقاتشده هیچ همسایهی ملاقات نشدهای وجود نداشت، سراغ رأس ملاقاتشدهی بعدی (در صف) رفته و عملیات 2 را برای آن انجام میدهیم.
درخت پوشای حاصل از پیمایش | پیمایش $\mathrm{BFS}\left(\circ \right)$ | گراف G |
\[\mathrm{\circ }\mathrm{,\ }\mathrm{1}\mathrm{,\ }\mathrm{2}\mathrm{,\ }\mathrm{3}\mathrm{,\ }\mathrm{4}\mathrm{,\ }\mathrm{5}\mathrm{,\ }\mathrm{6}\mathrm{,\ }\mathrm{7}\] |
مرتبه اجرایی BFS
اگر گراف G توسط ماتریس مجاورتی ارائه شود، آنگاه زمان لازم برای پیمایش BFS برابر با $\mathrm{O}\left({\mathrm{n}}^{\mathrm{2}}\right)=\mathrm{O}\left({\left|\mathrm{V}\right|}^{\mathrm{2}}\right)$ است.
اگر گراف G توسط لیست مجاورتی ارائه شود، آنگاه زمان لازم برای پیمایش BFS برابر با $\mathrm{O}\left(\mathrm{e}\right)=\mathrm{O}\left(\left|\mathrm{E}\right|\right)$ است.
دقت کنید از آنجایی که در هر گراف متصل $\mathrm{n}\mathrm{-}\mathrm{1}\mathrm{\ }\mathrm{\le }\mathrm{\ e\ }\mathrm{\le }\mathrm{\ n}\left(\mathrm{n}\mathrm{-}\mathrm{1}\right)/\mathrm{2}$ است بنابراین تقریباً $\mathrm{e\ >\ n}$ بوده و میتوان O(e) = O(n + e) و $\mathrm{O}\left(\left|\mathrm{E}\right|\right)=\mathrm{O}\left(\left|\mathrm{E}\right|+\left|\mathrm{V}\right|\right)$ در نظر گرفت.
مثال: ترتیب ملاقات گرهها در پیمایش ردیفی (BFS) در گراف روبهرو از چپ به راست کدام است؟
- 0-1-3-2-4-5-6-7-8-9
- 0-1-3-2-4-5-7-6-8-9
- 0-1-2-3-4-5-6-7-8-9
- 0-1-3-2-4-5-7-6-9-8
حل: گزینه 3 درست است.
مثال: لیست مجاورتی مربوط به گراف G به صورت زیر است. پیمایش سطحی این گراف کدام است؟
- A B D C F E
- A B C D E F
- A C F D E B
- A D C B E F
Adjacent list |
---|
A : B,C,D |
B : A,D,E |
C : A,D,F |
D : A,B,C |
E : B,F |
F : C,E |
حل: گزینه 2 درست است.
الگوریتم پیمایش BFS
procedure BFS (v)
begin
visit v;
1. AddQueue (Queue , v)
while queue is not empty do
begin
2. DeleteQueue (Queue , v)
for all vertices w adjacent to v do
if w is not visited then
begin
3. AddQueue (Queue , v)
visit w
end;
end;
end;
پیمایش عمق اول یا اول عمق (Depth First Search = DFS)
قاعده این نوع پیمایش گراف به صورت زیر است:
- رأس شروع را انتخاب کرده و ملاقات میکنیم (پیشفرض رأس )
- برای هر رأس ملاقاتشده، اولین رأس مجاور (همسایه) به آن را که تا به حال ملاقات نشده، ملاقات میکنیم.
- عملیات 2 را تا زمانی که همه رئوس یکبار ملاقات شوند ادامه میدهیم.
دقت کنید هرگاه برای یک رأس ملاقاتشده هیچ همسایهی ملاقات نشدهای وجود نداشت، سراغ رأس ملاقات شدهی قبلی (در پشته) رفته و عملیات 2 را برای آن انجام میدهیم.
درخت پوشای حاصل از پیمایش | پیمایش $\mathrm{DFS}\left(\circ \right)$ | گراف G |
\[\mathrm{\circ },\mathrm{1}\mathrm{,\ }\mathrm{3}\mathrm{,\ }\mathrm{7}\mathrm{,\ }\mathrm{4}\mathrm{,\ }\mathrm{5}\mathrm{,\ }\mathrm{2},\mathrm{6}\] |
مرتبه اجرایی DFS
اگر گراف G توسط ماتریس مجاورتی ارائه شود، آنگاه زمان لازم برای پیمایش DFS برابر با $\mathrm{O}\left({\mathrm{n}}^{\mathrm{2}}\right)=\mathrm{O}\left({\left|\mathrm{V}\right|}^{\mathrm{2}}\right)$ است.
اگر گراف G توسط لیست مجاورتی ارائه شود، آنگاه زمان لازم برای پیمایش DFS برابر با $\mathrm{O}\left(\mathrm{e}\right)=\mathrm{O}\left(\left|\mathrm{E}\right|\right)$ است.
دقت کنید از آنجایی که در هر گراف متصل $\mathrm{n}\mathrm{-}\mathrm{1}\mathrm{\ }\mathrm{\le }\mathrm{\ e\ }\mathrm{\le }\mathrm{\ n}\left(\mathrm{n}\mathrm{-}\mathrm{1}\right)/\mathrm{2}$ است بنابراین تقریباً $\mathrm{e\ >\ n}$ بوده و میتوان O(e) = O(n + e) و $\mathrm{O}\left(\left|\mathrm{E}\right|\right)=\mathrm{O}\left(\left|\mathrm{E}\right|+\left|\mathrm{V}\right|\right)$ در نظر گرفت.
مثال: ترتیب ملاقات گرهها در پیمایش عمقی (DFS) در گراف روبهرو از چپ به راست کدام است؟
- 0-1-2-3-4-5-6-7-8-9
- 0-1-2-4-3-5-6-7-8-9
- 0-1-2-3-4-5-6-7-9-8
- 0-1-3-2-4-5-7-6-8-9
مثال: لیست مجاورتی مربوط به گراف G به صورت زیر است. پیمایش عمقی (DFS) این گراف کدام است؟
- A B D C F E
- A B C D E F
- A C F D E B
- A D C B E F
Adjacent list |
---|
A : B,C,D |
B : A,D,E |
C : A,D,F |
D : A,B,C |
E : B,F |
F : C,E |
حل: گزینه 1 درست است.
مثال: در جستجوی عمق اول (DFS) گراف جهتدار زیر فرض کنید که گره 1، گره شروع باشد و گرههای مجاور یک گره به ترتیب مقدار عددیشان ملاقات میشوند. کدام گزینه ترتیب گرههای ملاقاتشده را نشان میدهد؟ (از چپ به راست)
- 1-2-3-4-11-5-6-7-10-8-9
- 1-2-8-5-3-9-6-4-11-10-7
- 1-2-5-8-3-9-6-4-10-7-11
- 1-2-3-4-5-6-7-8-9-10-11
الگوریتم پیمایش DFS
غیربازگشتی:
1.initialize all nodes to the ready state (status = 1)
2. push the starting node A onto STACK and change its status to the waiting state (STATUS = 2)
3. Repeat steps 4 and 5 until STACK is empty
4. Pop the top node N of STACK. Process its status to the processed state (STATUS = 3)
5. Push on to STACK all the neighbors of N that are still in the ready state (STATUS = 1), and change their status to the waiting state (STATUS = 2).
[ End of step 3 Loop ]
6. Exit
بازگشتی:
procedure dfs (v : vertex);
w : vertex;
begin
mark v as "visited";
for all vertices w adjacent to v do
if w is not "visited" then dfs (w);
end;
گراف همبند و پیمایش BFS و DFS
اگر گراف G توسط ماتریس مجاورتی ارائه شود، آنگاه زمان لازم برای تعیین گرافهای متصل با استفاده از پیمایشهای عمقی و سطحی برابر با $\mathrm{O}\left({\mathrm{n}}^{\mathrm{2}}\right)=\mathrm{O}\left({\left|\mathrm{V}\right|}^{\mathrm{2}}\right)$ است.
اگر گراف G توسط لیست مجاورتی ارائه شود، آنگاه زمان لازم برای تعیین گرافهای متصل با استفاده از پیمایشهای عمقی و سطحی برابر با $\mathrm{O}\left(\mathrm{n\ +\ e}\right)=\mathrm{O}\left(\left|\mathrm{V}\right|+\left|\mathrm{E}\right|\right)$ میباشد.
گراف برچسب دار (Labeled Graph)
گراف G برچسبدار یا گراف وزن دار یا گراف شماره دار میگویند اگر اطلاعاتی به یالهای آن نسبت داده شود. اگر اطلاع نسبت داده شده به یالها یک عدد غیرمنفی باشد به آن وزن یال یا هزینه یال میگویند.
درخت پوشای کمینه (MST: Minimum Spanning Tree)
اساساً گرافی که در آن یالها وزن داشته باشند گراف وزن دار نامیده میشود.
پیمایشهای هر گراف وزندار منجر به تولید درختان پوشا با 1- n لبه و با هزینههای متفاوت میشود. برای به دست آوردن درخت پوشایی که مجموع هزینه یالها (اضلاع) آن مینیمم باشد بایستی از الگوریتمهای خاصی استفاده کنیم.
در تمام الگوریتمها برای درختهای پوشا، از ملاک یا معیار کمترین هزینه استفاده میکنیم، روش ما باید دارای شرایط زیر باشد:
- باید فقط از لبههای داخل گراف استفاده کنیم.
- باید دقیقاً از 1- n لبه استفاده کنیم.
- نباید از لبههایی که ایجاد یک حلقه میکنند، استفاده کنیم.
الگوریتم راشال (کراسکال = Kruskal)
در این روش، درخت پوشای مینیمم (T)، لبه به لبه ساخته میشود تا دقیقاً 1- n یال برای انتخاب شود. در هر مرحله یالی را انتخاب میکنیم که اولاً کمترین هزینه را داشته باشد ثانیاً با لبههای انتخاب شده در مراحل قبل حلقه ایجاد نکند، (به عبارت بهتر لبههای مورد استفاده در T، به ترتیب صعودی وزنها میباشد و یک لبه در T خواهد بود، اگر با لبههای قبل که در T بودهاند، تشکیل یک حلقه ندهد)
دقت کنید:
1. در هر مرحله از الگوریتم کراسکال ممکن است یک جنگل داشته باشیم.
2. در پایان کار یک درخت پوشا با هزینه مینیمم وجود دارد.
3. اگر G یک گراف همبند بدون جهت باشد، الگوریتم راشال یک درخت پوشای حداقل را ایجاد میکند.
مراحل الگوریتم کراسکال
مراحل الگوریتم کراسکال را برای گراف زیر جلو میبریم.
(1) | (2) | (3) |
(4) | (5) | (6) |
شبه کد الگوریتم کراسکال
T = {};
While (T contains less than n-1 edges & & E is not empty) {
choose a least cost edge (v , w) from E;
delete (v , w) from E;
if ((v , w) does not create a cycle in T)
add (v , w) to T;
else
discard (v , w);
}
if (T contains fewer n-1 edges)
printf ("No spanning tree \ n");
در آغاز، E مجموعهای از تمام لبهها در G است. تنها اعمالی که میخواهیم روی این مجموعه انجام دهیم، عبارتند از:
- تعیین یک لبه با کمترین هزینه
- حذف آن لبه
هر دو مورد را میتوان به شرطی که خطوط موجود در E به عنوان یک لیست ترتیبی مرتب شده باشد، انجام داد. لبههای موجود در E در زمان O(e log e) مرتب میشوند. مسلماً، همهی لبهها در E الزاماً نباید مرتب شوند و ما قادر هستیم لبه بعدی با حداقل هزینه را به سادگی تعیین کنیم. به نظر میرسد که مرتبسازی heap روش مناسبی برای مرتب کردن باشد که در این صورت لبه بعدی در زمان O(log e) تعیین و حذف میگردد. انجام عمل مرتبسازی heap به تنهایی به زمانی برابر با O(e) نیاز دارد.
مرتبه اجرایی: الگوریتم راشال را در زمانی برابر با O(e log e) پیادهسازی میکنیم به نحوی که e تعداد لبهها در G میباشد.
مثال: هزینه درخت پوشا با کمترین هزینه در گراف زیر کدام است؟
- 12
- 15
- 16
- 22
حل: گزینه 2 درست است.
\[\mathrm{cost\ of\ min\ spanning\ tree\ =\ }\mathrm{1}\mathrm{\ +\ }\mathrm{2}\mathrm{\ +\ }\mathrm{3}\mathrm{\ +\ }\mathrm{3}\mathrm{\ +\ }\mathrm{6}\mathrm{\ =\ }\mathrm{15}\]
الگوریتم پریم (Prim)
الگوریتم پریم با یک درخت مانند T، که تنها شامل یک رأس است، شروع میکند. این رأس میتواند هر یک از رئوس در گراف اصلی باشد. سپس، یک لبه با کمترین هزینه به گونهای انتخاب میشود که اولاً یکی از رئوسش در درخت T باشد ثانیاً هزینه آن مینیمم باشد این عمل را تا زمانی که T شامل 1- n لبه باشد، ادامه میدهیم.
برای اطمینان از این که لبههای اضافه شده تشکیل یک حلقه یا سیکل نمیدهند، در هر مرحله لبهای مانند (u , v) با هزینه مینیمم را به گونهای انتخاب میکنیم که دقیقاً یکی از رئوس u یا v در T وجود داشته باشد. دقت کنید در هر مرحله از الگوریتم پریم حتماً یک درخت وجود دارد.
مراحل الگوریتم پریم
در شروع کار درخت T با رأس $\mathrm{\circ }$ شروع میشود.
(1) | (2) | (3) |
(4) | (5) | (6) |
مرحله 1: لبه $\left(\mathrm{5}\mathrm{\ ,\ }\mathrm{\circ }\right)$ بهگونهای انتخاب شده که اولاً یک رأس آن $\left(\mathrm{\circ }\right)$ در T بوده و ثانیاً هزینه آن مینیمم است.
مرحله 2: ...
شبیه کد الگوریتم پریم
T = {};
TV = {0}; /*start with vertex 0 and no edges*/
While (T contains fewer than n-1 edges){
let (u , v) be a least cost edge such that u TV and
v TV;
if (there is no such edge)
break;
add v to TV;
add (u , v) to T;
}
if (T contains fewer n-1 edges)
printf ("No spanning tree \ n");
الگوریتم پرایم را در زمانی برابر با $\mathrm{O}\left({\mathrm{n}}^{\mathrm{2}}\right)$ پیادهسازی میکنیم به نحوی که n تعداد رئوس در G میباشد.
الگوریتم سالین (Sollin)
در این روش در مرحله اول یک جنگل متشکل از تمام رأسهای گراف تشکیل میدهیم بهطوری که هزینه آن مینیمم باشد. سپس با انتخاب یالهایی با هزینه مینیمم سعی میکنیم جنگل را به درختی با هزینه مینیمم تبدیل کنیم.
مراحل الگوریتم سالین
(1) | (2) |
همواره هزینه مینیمم درخت پوشا به دست آمده در تمام الگوریتمها یکسان است. اما درخت پوشای به دست آمده از همه روشها یکسان نیست مگر آن که:
1- یال با لبه تکراری نداشته باشیم یا 2- گراف در ابتدا یک درخت پوشا 1- n لبه باشد.
گراف در کامپیوتر چیست؟
واژه گراف در ترجمه تحت الفظی به معنای نمودار است اما با نمودارهایی که اغلب ما میشناسیم متفاوت است. گرافها نوعی از ساختمان داده هستند و یکی از اصلی ترین ویژگیهای آنها این است که دادههای آنها از یک ترتیب خاص پیروی نمیکنند. در این مقاله به تعریف و معنای گراف و همچنین جوانب مختلف درس نظریه گراف پرداخته شده است.
نظریه گراف چه کاربردی دارد؟
در علوم کامپیوتر، از گرافها برای نمایش شبکههای ارتباطی، سازماندهی دادهها، دستگاههای محاسباتی و غیره استفاده میشود. به عنوان مثال، ساختار لینک یک وب سایت را میتوان با یک گراف جهت دار نشان داد که در آن رئوس نشان دهنده صفحات وب و یالهای جهت دار نشان دهنده لینکهایی از یک صفحه به صفحه دیگر است. برنامه مسیریابی شما از الگوریتم جستجوی گراف برای یافتن سریعترین مسیر از خانه شما به محل کارتان استفاده میکند. از دیگر کاربردهای آن میتوان به تجزیه و تحلیل شبکهها، تخصیص منابع در سیستم عامل و یادگیری عمیق، Functional Programming و ... اشاره کرد.
API یا همان واسط نرم افزار برنامه ی کاربردی (Application Program Interface) در واقع یک سری کد است که برقراری ارتباط بین دو برنامه را امکانپذیر میکند. برنامهها میتوانند یک نرم افزار کامپیوتری، یک وب سایت و یا یک سیستم عامل باشند. به وسیلهی این کدها،برای توسعه دهندگان امکان تقاضا برای دریافت سرویس از این برنامهها و تبادل اطلاعات بین برنامهها، فراهم شده است.
تقریبا امکان تبادل هر نوع دادهای به وسیلهی API وجود دارد. APIها به وسیلهی فراخوان توابع نرم افزاری یا همان Function Call پیاده سازی میشوند. سینتکسهای (Syntax) مربوط به هر API نیز داخل Document برنامهی مربوط به آن نوشته شده است. به عنوان مثال فرض کنید یک API برای یک برنامهی هواشناسی وجود دارد. به وسیلهی سینتکسها یا همان کدهای واسط این برنامهی هواشناسی، میتوان سرویسهای ارائه شده را درخواست کرد. مثلا دمای هوای یک شهر خاص یا میزان رطوبت و پیشبینی دمای هوا در روزهای آتی.
API ها چگونه کار می کنند؟
APIها از دو بخش تشکیل شدهاند. بخش اول در واقع مشخصات و نحوهی تبادل اطلاعات بین برنامه ها را مشخص میکند، یعنی همان درخواستی که برنامهی گیرنده از فرستنده دارد و فرستنده اطلاعات خواسته شده را در قالب و فرمت درخواستی بر میگرداند. بخش دوم همان واسط نرم افزاری است که برای ارتباط بین برنامهها ساخته و منتشر شده است. دو مفهوم Publish و Call در API وجود دارد. نرم افزاری که API را میسازد، آن را Publish یا منتشر میکند. نرم افزاری که از این API ساخته شده و منتشر شده تقاضای یک سرویسی میکند، تقاضا را Call یا فراخوان میکند.
برای دسترسی و درخواست سرویسها از APIها، اکثر آنها سیستمهایی برای احراز هویت و دریافت مجوز دارند. به عنوان مثال ممکن است قسمتی از API تنها به صورت رایگان در دسترس باشد و قسمتی دیگر خیر، یا مثلا دسترسی افراد عادی به API با دسترسی شرکتها فرق کند. همچنین APIها امکان رصد کردن کاربرانی را که از سرویسهای آنها استفاده میکنند را نیز دارند. به عنوان مثال چه کاربری، چه موقع و از چه سرویسی در کجا استفاده کرده است.
دو نوع معماری و ساختار متداول برای ساخت APIها وجود دارد. معروف ترین آنها REST که مخفف Representational State Transfer و دیگری SOAP یا Simple Object Access Protocol است. این دو معماری یک پروتکل ارتباطی بر مبنای XML را ارائه میدهند. معماری SOAP به زیر ساخت سطح پایین یا Low-level کمتری نسبت به معماری REST نیاز دارد، اما کار با REST راحتتر است و امکان پیاده سازی آن برای وب سایتها و سرویسها به سادگی قابل انجام است. در حال حاضر از معماری REST به طور گستردهتری استفاده میشود. به ویژه در بحث ارتباط میان وب سایتها و ارتباط بین اپلیکیشن و وب سایت (مثلا نرم افزار های موبایلی).
چرا API ها برای یک کسب و کار مهم هستند؟
استفاده از API باعث سهولت و افزایش کیفیت یک نرم افزار در ارائهی خدمات میشود. نرم افزارهایی که برای یک هدف مشخص ساخته شده بودند، امروزه معمولا در قالب API پیاده سازی میشوند تا ویژگیهای خاصی را ارائه دهند. به این وسیله زمان و هزینهی توسعه دادن کاهش پیدا میکند و از انواع ارورها و خطاها جلوگیری میشود. به عنوان مثال در همین API هواشناسی که پیشتر ذکر شد، توسعه دهندگان به راحتی میتوانند داخل نرم افزار خود از امکانات هواشناسی استفاده کنند. اگر چنین APIای وجود نداشت، مسلما خود توسعه دهنده میبایست به ساخت یک نرم افزار هواشناسی از ابتدا میپرداخت.
تعداد بالای وب سرویس هایی که از طریق API با ارائه دهندگان ابری یا Cloud Providers ارتباط برقرار میکنند، باعث بهوجود آمدن برنامههای کاربردی مخصوص ابری یا Cloud-Specific و برنامههایی برای پشتیبانی از تلفنهای همراه شده است.
APIها باعث ایجاد موقعیتهای شغلی و کسب و کارهای جدید نیز شدهاند. به عنوان مثال API ای را فرض کنید که قیمت روز ارزهای مختلف یا سهامها را مشخص میکند. این API میتواند از درخواست کنندههای سرویساش پول دریافت کند. حالا نرم افزارهایی هستند که نیاز به بهروز بودن قیمتها دارند. مثلا صرافیها، تبادلات ارزی، پیش بینی قیمت و... اینها میتوانند با پرداخت هزینهای، از امکانات API مذکور استفاده کنند.
استفاده از API چه مزایایی دارد؟
APIها معمولا یکسری قوانین و قواعد یکسانی دارند. به همین دلیل به یک شرکت کمک میکند تا برنامه نویسان آن شرکت، از یک قاعدهی یکسان برای کد نویسی استفاده کنند. این امر باعث افزایش خوانایی کد ها و سهولت در استفاده و ارتقای نرم افزار میشود. همچنین برقراری ارتباط و همکاری بین هم تیمیهای یک شرکت نیز راحتتر صورت میگیرد. که این امر خود موجب جلوگیری از هدر رفت زمان و کاهش هزینه های اضافی میشود.
APIها سازمانها را قادر میسازد تا:
- به صورت ایمن بر اینکه کدام کاربر و سیستم، از چه دادههایی و چه سرویسی از API استفاده میکنند را مدیریت کنند.
- با اجازه دادن به اشخاص ثالث برای استفاده از دیتاهای خود، برند خود را در معرض دید قرار دهند تا معروفتر شوند.
- از API خود کسب درآمد کنند. به عنوان مثال شرکتها حاضرند برای استفاده از یک رابط پرداختی امن، به کمپانی PayPal برای دریافت API و استفاده از خدمات آن پول پرداخت کنند (از نمونههای داخلی هم میتوان به زرین پال و پارس پال اشاره کرد).
از آنجایی که APIها از استانداردهای خاصی پیروی میکنند، پیاده سازی و توسعه ی API میتواند پیچیده و پرهزینه باشد.
انواع API ها
به طور کلی 4 نوع API وجود دارد: خصوصی (Private)، عمومی (Public)، مشارکتی (Partner) و ترکیبی (Composite). در زیر به توضیح مختصر هر یک از این APIها پرداخته شده است:
- API خصوصی: API خصوصی یا همان درونی (Internal) به API ای گفته میشود که تنها داخل یک شرکت و توسط توسعه دهندهها به منظور افزایش و بهبود عملکرد محصولات آن شرکت استفاده میشود. این نوع APIها در معرض دید عموم قرار ندارند و اشخاص ثالث قادر به استفاده از آن نیستند.
- API عمومی: این نوع APIها به طور عمومی منتشر میشوند و همگان قادر به استفاده از این نوع API هستند. هیچ گونه محدودیتی در استفاده از این نوع APIها وجود ندارد.
- API مشارکتی: APIهای مشارکتی تنها در دسترس افراد و شرکتهایی قرار میگیرد که سازندهی آن API، اجازهی دسترسی را به آنها داده است. این نوع APIها معمولا در ارتباط بین کسب و کارهای مختلف یک مجموعه مورد استفاده قرار میگیرد.
- API ترکیبی: این API چندین API را باهم ادغام یا ترکیب میکنند. توسعه دهندگان به وسیلهی تنها یک API از این نوع، میتوانند از سرویسهای مختلفی به صورت همزمان استفاده کنند. همچینین استفاده از این نوع API باعث افزایش کارایی و سرعت نیز میشود.
API میتواند از یک منظر دیگر نیز به سه دسته ی Local، Web و Program نیز تقسیم شوند.
- API محلی یا Local: سرویسهای یک میان افزار یا سیستم عامل را به برنامههای کاربردی ارائه میدهند. به عنوان مثال مایکروسافت دات نت یا Microsoft’s .NET، یک API ای است که دسترسی به بخشهای مختلف سیستم عامل را به راحتی به برنامه نویسان و توسعه دهندگان نرم افزارها میدهد. یا به عنوان مثالی دیگر، میتوان به API دسترسی به دیتابیس نیز اشاره کرد.
- API وب: طراحی شدهاند تا در صفحات HTML، مورد استفاده قرار گیرند. با استفاده از پروتکل HTTP، به راحتی میتوان با این APIها تعامل کرد. اکثر URLها در صفحات وب از این نوع API استفاده میکنند و معماری آنها نیز معمولا REST است. به همین دلیل به این APIها معمولا RESTful میگویند.
- API برنامه یا Program: بر پایهی فناوری RPC یا Remote Procedure Call ساخته شده است. به وسیلهی این نوع APIها میتوان سرویسهای یک برنامه را در برنامهی دیگر از راه دور (Remote) صدا زد. از نمونههای این API میتوان به SOA یا Service Oriented Architecture ها اشاره کرد. Microsoft’s WS-series یک نمونه از این نوع API است.
چرا طراحی API مهم است؟
طراحی و ساخت API، یکی از موارد اساسی برای هر شرکتی است و طرز ساخت آن از اهمیت بالایی برخوردار میباشد. معمولا وقت زیادی صرف این میشود که یک API به گونهای طراحی شود تا همهی جوانب نیازهای کاربران بررسی شود تا در نهایت یک API کارا و مفید تحویل مشتریان و کاربران داده شود. همچنین نوع ساختمان دادهآموزش ساختمان داده و الگوریتمهر ساختمان داده یک نوع فرمت ذخیرهسازی و مدیریت دادهها در کامپیوتر است، که امکان دسترسی و اصلاح کارآمد آن دادهها را برای یکسری از الگوریتمها و کاربردها فراهم میکند، در این صفحه به بررسی و آموزش ساختمان داده و الگوریتم پرداخته شده است و پارامترهای ورودی یک API نیز از مهم است. زیرا این مقادیر بین Publisher و Caller باید یکسان باشد. یک API برای دریافت اطلاعات فیلمهای سینمایی را در نظر بگیرید. وقتی از این API درخواست اطلاعات یک فیلم خاص میشود، ساختمان دادهی این درخواست باید از قبل مشخص باشد تا توسعه دهندگان بتوانند آن را به درسی به مشتریان خود نمایش دهند. مثلا پارامتر نام فیلم، امتیاز، زمان، نظر ها و...
از موارد مهم دیگر در طراحی یک API، امنیت آن میباشد. APIها باید از امنیت بالایی برخوردار باشند، زیرا این APIها واسط نرم افزاری بین کاربران و شرکت هستند. کاربران به دادهها و همچنین اطلاعات خاصی از شرکت از طریق این API دسترسی دارند. حال اگر در API مذکور یک شکاف امنیتی وجود داشته باشد، هکرها میتوانند به آن نفوذ کنند و به اطلاعات شرکت دسترسی پیدا کنند و انواع اقسام حملههای دیگر. بنابراین بحث امنیت از اهمیت بالایی برخوردار است.
نمونه هایی از API ها
از نمونههای API میتوان به سیستم عاملها و میان افزارها اشاره کرد. سیستم عامل ها معمولا ویژگی های API خود و امکانات آن را در قالب Toolkit منتشر میکنند. به وسیلهی این Toolkit میتوان برای آن سیستم عامل، انواع نرم افزارها و برنامهها را تولید کرد. یکی از نمونههای بارز این نوع API همانطور که گفته شد Microsoft’s .NET است که ابزارها و کدهایی را در دسترس توسعه دهندگان قرار داده است تا به وسیلهی آن بتوان برای سیستم عامل (و یا وب) نرم افزار تولید کرد.
بسیاری از نرم افزارها و برنامههایی که توسط شرکتها ساخته میشوند، دارای API خاص خود هستند. به عنوان مثال ابزارهای DevOps مانند Docker (داکر)، Jenkins و یا Gitlab. نرم افزارهای شبکههای اجتماعی نیز APIهای مخصوص نرم افزارهای خود را میسازند تا اشخاص ثالث بتوانند از عملکردهای آن نرم افزار استفاده کنند و یا آنهارا بهبود ببخشند.
بستر اصلی API در حال حاضر اینترنت است. شرکتهای مختلفی مانند فیسبوک، گوگل، یاهو و... APIهای خود را ساخته و منتشر کردهاند تا توسعه دهندگان بتوانند از آنها استفاده کنند و ویژگیهای جدیدی برای نرم افزار خود بوجود بیاورند. به عنوان مثال افراد زیادی با استفاده از APIهایی که اینستاگرام ساخته و منتشر کرده است، نسخههای شخصی از اینستاگرام را میسازند و ویژگیهای جدیدی را به آن اضافه میکنند. مثلا قابلیت دانلود تصاویر، ویدیو و استوری. و یا با استفاده از APIهای نرم افزار تلگرام، ویژگیهایی مثل حالت روح و تغییر صدا به آن اضافه شد.
روند API
با توجه به استفادهی گسترده از اینترنت و فراگیر شدن رایانش ابری (Cloud Computing) خیلی از برنامهها و نرم افزارها از حالت تک بعدی و یکپارچه بودن به سمت ریز سرویس ها یا Microservice ها تبدیل شدهاند که استفاده از APIها کمک شایانی به این امر کرده است.
ساختار REST و وب: APIهای تحت وب از طریق تمامی زبانهای برنامه نویسی قابل فراخوانی هستند. همچنین امکان فراخوانی آنها در صفحات HTML یا همان صفحات وبسایتها نیز وجود دارد. افزایش روزانهی استفاده از اینترنت و سیستمهای ابری، طریقهی استفاده از این APIها را ساده کرده است. حتی بدون دانش برنامه نویسی و نوشتن کد نیز میتوان به این APIها تنها از طریق وبسایت مورد نظر دسترسی داشت.
هردو ساختار REST و SOAP میتوانند به سرویسهای ابری متصل شوند، آنهارا مدیریت کنند و یا توابعهای آن را فراخوانی کنند. اما استفاده از سیستم REST در API تحت وب به شدت محبوب تر است. زیرا پهنای باند کمتری را مصرف میکند و سادهتر نیز میباشد. همچنین به وسیلهی زبانهایی مثل جاوا اسکریپت و پایتون میتوان به راحتی این سیستمها را پیاده سازی نمود. امروز اکثر شرکتها و وبسایتهای بزرگ نظیر آمازون، گوگل، لینکدین، و تویتر از API های RESTful برای سایت خود استفاده میکنند.
API ها و سیستم های ابری
همانطور که میدانید رایانش ابری، قابلیتهای جدیدی به نوع رایانش و پردازش اضافه کرده است که در آن، یک جز و یا یک فرایند، به بخشهای کوچکتری تقسیم شده و در نهایت در مقایس بزرگتر به هم متصل میشوند. یک فرایند میتواند به چند بخش تقسیم شده و توسط کامپیوترهای متعددی به صورت موازی پردازش شود. سیستم های ابری، الگوهای APIها را از مدل RPC-Programmer-Centric که پیش تر به آن اشاره کردیم، به سمت مدل RESTful Web-Centric تغییر داده است.
API ها به عنوان یک سرویس
قبلتر معمولا API را به دید تنها یک منبع میدیدند. مثلا پایگاهی برای دریافت اطلاعات در مورد قیمت، در مورد یک فیلم، وضعیت جوی و... که در برنامهها و ابزارها از آنها استفاده شود. اما امروزه به عنوان یک سرویس از آنها استفاده میشود که نیاز به کنترل و توسعهی بیشتری دارند. SOA و میکرو سرویس ها از نمونههای سرویس های API هستند.نقش API به عنوان سرویس، یکی از داغ ترین مباحث و روندهای APIها هستند که حتی پیش بینی شده در آینده تمامی APIها به عنوان سرویس دهنده عمل خواهد کرد.
انتشار و مدیریت API
شرکتهایی که به تولید و انتشار APIها میپردازند. مسئول کنترل کیفی این APIها، قابلیت اطمینان، کارایی و امنیت این APIها هستند. همچنین کنترل کردن عملکردهای جدید نیز بر عهدهی آنهاست. فرض کنید یک شرکتی، APIای ساخته برای دریافت قیمت روز ارز های دیجیتال، ممکن است تعداد درخواست کنندههای قیمت از هزار به چند ده و چند صد هزار کاربر افزایش پیدا کند. اگر سروری که این API بر روی آن مستقر است ضعیف باشد. کارایی این API پایین میآید و سرعتش کم میشود. بنابراین نیاز به بروز رسانی سرور است. یا فرض کنید ارزهای جدیدی وارد بازار شده اند. این API نیز باید با بروز رسانی، از ارزهای جدید پشتیبانی کند.
تست کردن API
مشابه تمامی نرم افزارها، APIها هم نیاز به تست کردن دارند. از ساختار آن گرفته تا نحوهی درخواست و دریافت اطلاعات، همه و همه میبایست تست شوند. همچنین با تست یک API مطمئن میشویم که:
- ارتباط بین نرم افزارها و به اشتراک گذاری اطلاعات بین آنها به درستی عمل میکند.
- اطلاعات بین شرکا همانطور که انتظار داریم تبادل میشود.
- دادههای بی ربط و اشتباه وارد پایگاه داده نمیشود و عملکرد برنامهها را مختل نمیکند.
- یک برنامه در تمامی پلتفرمها مثل دستاپ، موبایل و وب به درستی عمل میکند.
تست API معمولا بخشی از روند مدیریت چرخهی عمر برنامه یا Application Lifecycle Management (ALM) است، چه برای نرم افزاری که این API را منتشر کرده و چه برای برنامه و نرم افزاری که از این API استفاده میکند. APIها همچنین بعد از منتشر شدن هم تست میشوند که بررسی شود آیا به درستی کار میکنند یا خیر.
مدیریت API
بخش آخر این مقالهی مربوط به مدیریت APIها است. مدیریت API معمولا به قسمتی از روند کار API که مربوط به منتشر کردن آن و قابل استفاده کردن آن برای کاربران است اطلاق میشود. همچنین اینکه کاربران چگونه به این API میبایست دسترسی پیدا کنند، سیاستهای استفاده و مجوزهای لازم برای دسترسی به API هم در حیطهی کاری مدیریت API قرار دارد.
مدیریت API امری رایج است. همچنین از یک سازمان به سازمان دیگر ممکن است روند کار فرق کند. اما معمولا برخی از عملکردهای اساسی همانند امنیت، تجزیه و تحلیل اطلاعات و کنترل نسخهها بر عهدهی مدیریت API میباشد.
API ها به مستندات قوی و دقیق، قابلیت اطمینان و ایمن نیازمند هستند. برای برآورده کردن این نیازها، شرکتها معمولا از یک نرم افزار مدیریت API یا API Management Software استفاده میکنند که معمولا شامل چندین مولفهی اصلی هستند. لیست این مولفهها در زیر آمده است:
- API Developer Portal
- API Lifecycle Management
- API Policy Manager
- API Analytics
- API Gateway
منظور از API Economy چیست؟
پیشتر گفتیم که بعضی از قسمتهای API ممکن است رایگان باشد و بعضی از موارد دیگر خیر. شرکتها و تیمهای بسیاری وجود دارند که راه کسب درآمد آنها از طریق گرفتن حق الزحمه در قبال استفاده از API آنها صورت میگیرد. به عنوان مثال به ازای هر هزار درخواست یا Request ای که از سرویس آنها انجام میگیرد، چند دلار دریافت میکنند. بنابراین هرچه تعداد کاربران یک اپلیکیشن بیشتر باشد، تعداد درخواستها نیز بالاتر و هزینه به مراتب بیشتر میشود. به عنوان مثال یکی از API های معروف در این زمینه نقشهی گوگل یا Google Map است که به ازای هر ریکوئست مبلغ 0.003 دلار را از مصرف کننده دریافت میکند.
API چیست؟
API یک واسط نرم افزاری بین دو برنامه ی مختلف است که از طریق آن امکان ارتباط با یک دیگر را دارند. کاربران و اشخاص ثالث میتوانند توابع یک برنامه را به وسیله ی درخواست از یک API فراخوانی کنند. مانند درخواست موقعیت جغرافیایی یک منطقه از API نقشه گوگل یا درخواست دمای هوای یک شهر از API هواشناسی.
API چطور کار می کند؟
دو نوع متداول معماری SOAP و REST برای پیاده سازی API وجود دارد. معمولا برای APIهای تحت وب از معماری و ساختار REST استفاده میشود که به این سیستم ها RESTful میگویند. با توجه به کدهای ارتباطی که نوشته شده است، میتوان به پایگاه دادهی سرویس دهندهی API دسترسی داشت و از آن درخواست اطلاعات کرد.
آیا API دارای یک ساختمان داده ی مشخصی است؟
خیر، تقریبا هر نوع ساختاری با هر نوع داده را میتوان توسط API پیاده سازی کرد. به عنوان مثال دادهی دریافتی میتواند یک عدد باشد، یک رشته باشد، یک آرایه و هر دادهی دیگری میتواند باشد.
آیا تنها برنامه ها می توانند از API ها استفاده کنند؟
خیر افراد عادی و اشخاص ثالث نیز با استفاده از URLهای وبسایتها میتوانند درخواستهای خود از پایگاه دادهی وبسایت را ایجاد کنند.
آیا API در جایی به غیر از وب کاربرد دارد؟
بله، سیستم عاملها نیز API میسازند تا به وسیلهی آن، توسعه دهندگان، نرم افزارها و برنامههای کاربردی برای آن سیستم عامل ایجاد کنند.
یکی از المانهای اساسی در مدارات الکترونیکی، آی سی (IC) است. به عبارتی در طراحی برد الکترونیکی، آی سی که تحت عناوین تراشه و چیپ (Chip) نیز شناخته می شود، نقش مغز را ایفا میکند!
این قطعه معمولا به رنگ مشکی در برد مدارات چاپی PCB (Printed Circuit Board) به چشم میخورد.
ICهای موجود روی مادربورد سیستم کامپیوتری
IC مخفف عبارت Integrated Circuit (به معنی مدار مجتمع) است. منظور از مدار مجتمع یا چیپ این است که یک مدار بزرگ الکترونیکی را به صورت یک قطعه الکترونیکی بسیار کوچک، با دقیقا همان کاراییهای قبلی، درآوردهاند که تنها حدود یک سانتیمتر مربع فضا اشغال میکند. تراشه ها شامل عناصری بوده که از نظر الکتریکی جدا نشدنی و به یکدیگر متصل هستند.
هر چیپ چندین ورودی و خروجی دارد؛ از اینرو با پردازش ورودیها، مقادیر خروجی را تولید کرده و در اختیار بخشهای خروجی خود قرار میدهد. از مهمترین قطعات یک کامپیوتر که براساس تکنولوژی IC ساخته شده است میتوان به پردازنده یا همان سی پی یو (CPU) اشاره کرد که میلیاردها ترانزیستور را در خود جای داده است. بنابراین یکی از مهمترین کاربردهای Chipها در ساخت واحد پردازش مرکزی کامپیوتر است.
اکنون که يک آشنايی با اين المان مهم پيدا کرديم، به تعريف دقيق و فني آن خواهیم پرداخت.
IC چیست؟
آی سی به مجموعهای از مدارهای الکترونیکی اطلاق میگردد که روی یک صفحهی نازک و کوچکِ مسطح از جنس نیمه رسانا (عموما سیلیکون) ساخته میشود. این مدارات الکترونیکی شامل تعداد بسیار زیادی (امروزه در حد میلیون یا میلیارد) مقاومت، خازن و ترانزیستور هستند که روی این صفحه سیلیکونی ساخته میشوند.
ترانزیستور یک سوئیچ باینری و بلوک اصلی ساختار مدارهای کامپیوتری است. در ابتدا این مدارها چند ده ترانزیستور بیشتر نداشتند، ولی با تکامل فناوری ساخت IC آنها هم به سمت پیچیدهتر شدن رفتند. این قطعه وظیفه دارد درباره عبور یا عدم عبور جریان تصمیم گیری کند.
همانطور که پیش تر بیان شد، آی سی (IC) تحت عناوین متفاوتی شناخته می شود که عبارتند از: تراشه، چیپ (Chip) و مدارات مجتمع.
شما میتوانید تعداد ترانزیستورهای بکار رفته در نسلهای مختلف CPU را در اینجا مشاهده کنید.
نحوه تولید سی پی یو که خود نوعی چیپ محسوب میشود
در تراشه، ترانزیستورها بهعنوان کلیدهای الکتریکی عمل میکنند که میتوانند جریان را قطع یا وصل کنند. با اینکه در تعریف بالا ذکر شد که مدارات الکترونیکی بکار رفته، خازن و مقاومت را نیز شامل میشوند اما در ساخت ICها طراحان سعی میکنند به جاي استفاده از المانهاي ديگر تا حد امکان از ترانزیستور استفاده کنند. برای مثال بجای خازن از ترانزیستور در بایاس معکوس استفاده میکنند چرا که ترانزیستور موجب کاهش حجم نهایی مدار میشود؛ و یا در جایی دیگر که مقاومت بزرگی نیاز دارند، مثلاً در حد مگا اهم باز از ترانزیستور استفاده میکنند، چون در حجمی که مقاومت اشغال میکند میتوان چندین ترانزیستور جای داد.
آی سی نیز همانند دیگر قطعات کامپیوتر، برای عملکرد درست نیاز به برنامه نویسی دارد. در برنامه نویسی IC ابتدا نرم افزار از طریق کد ایجاد شده و سپس به مدار مجتمع اضافه می شود. در این روند از کامپیوتر بعنوان یک پل برای آپلود کدهای نوشته شده در تراشه استفاده می شود.
تقریباً تمام نمونههای برنامه نویسی آی سی برای میکروکنترلرها انجام میشود، زیرا میکروکنترلرها معمولاً بدون داشتن نرمافزار و دستورالعملهای آی سی بیفایده هستند.
در ساخت ICها یا از ترانزیستورهای دو قطبی BJT استفاده میکنند که اصطلاحاً به آنها TTL می گویند یا از ترانزیستورهای Mosfet که اصطلاحاً به آنها CMOS میگویند. البته به ترکیب این دو تکنولوژی با یکدیگر، BiCMOS میگویند.
تاریخچه پیدایش آی سی
آی سی ریشه در اختراع ترانزیستور در سال 1947 توسط ویلیام برادفورد شاکلی (William Bradford Shockley Jr) و تیمش در آزمایشگاههای بل دارد. تیم شاکلی (از جمله جان باردین John Bardeen و والتر براتین Walter Houser Brattain) دریافتند که در شرایط مناسب، الکترونها در سطح بلورهای خاصی مانعی تشکیل میدهند و آنها با استفاده از این مانع یاد گرفتند که جریان الکتریسیته را از طریق کریستال کنترل کنند. کنترل جریان الکترون از طریق یک کریستال به تیم اجازه میدهد تا دستگاهی ایجاد کند که می تواند برخی عملیات الکتریکی مانند تقویت سیگنال را که قبلاً توسط لوله های خلاء انجام می شد، انجام دهد.
سالهاي بعد مدار مجتمع برای اولین بار به عنوان یک مفهوم توسط مهندس رادار بریتانیایی جفری دامر (Geoffrey Dummer) در 7 می 1952 معرفی شد. سپس پس از آن توسط جک کیلبی (Jack Kilby) و رابرت نویس (Robert Noyce) توسعه یافت و در 12 سپتامبر 1958 با موفقیت به نمایش درآمد.
وظایف تراشه ها در کامپیوتر
هر ریز تراشه، وظیفه یا وظایف خاصی را در مدار انجام میدهد. عموماً هر ریز تراشه چندین ورودی دارد که با پردازش این ورودیها، مقادیر خروجی را تولید و در بخش خروجی خود قرار میدهند. بعضی از این تراشهها با سیگنالهای آنالوگ کار میکنند (مانند ریز تراشهای باکد 741 که یک تقویتکننده آنالوگ است). بعضیهای دیگر با سیگنالهای دیجیتال کار میکنند، مانند ریز تراشهای که برای خواندن اطلاعات موجود در یک CD استفاده میشود.
واحد پردازنده مرکزی کامپيوترها (CPU) یکی از مهمترین مدارات ساخته شده به صورت مجتمع است که میلیاردها ترانزیستور را در سطح کوچکی از نیمرسانا جای دادهاست؛ مثلاً پروسسورIBM z13 Storage Controller که در سال ۲۰۱۵ ساخته شدهاست، حدود ۷٬۱۰۰٬۰۰۰٬۰۰۰ ترانزیستور را درmm² 678 سطح نیمرسانا از ویفر(wafer) جای دادهاست. به طور کلی یک IC می تواند به عنوان یک تقویت کننده، نوسان ساز، تایمر، شمارنده، حافظه کامپیوتر یا ریز پردازنده باشد.
امروزه از مدارهای مجتمع در وسایل جانبیايی مانند صفحهکلید و موس، هدفون، بلندگو و میکروفون و همچنين گوشیهای هوشمند و تبلتها استفاده میشود.
IC ها در موارد زیر نیز، کاربرد دارند :
- تقویت کننده (Amplifires) : مدار الکتریکی که سیگنال ورودی را تقویت میکنند.
- نوسان ساز (Oscillator) : مدار الکتریکی که سیگنال های نوسانی تولید میکند.
- زمان ستج (Timer)
- شمارنده (Counter)
- گیت های منطقی
- حافظه کامپیوتر
- ریزکنترلگر و ریزپردازنده (MicroController , MicroProcessor)
نحوه ساخت IC
روش ساخت IC یا مدار مجتمع این گونه است که مدارهای الکتریکی را در لایه نازکی از سیلیسیم که ویفر سیلیکون نام دارد، تعبیه میکنند و همین کار را لایه به لایه تکرار میکنند. ترکیبات پیچیدهای که در ساخت آی سیها استفاده میشود، سبب شده طراحی و تولید این Microchip، تنها به چند کشور مانند آمریکا محدود شود. فرآیند ساخت IC در اجایی به نام "اتاق تمیز" یا Clean room، صورت میگیرد. علت این موضوع این است که سطح ناخالصی و طیفهای نوری موجود در محیط حین ساخت این تراشه، کاملا تحت کنترل باشد.
انواع IC در سیستمهای کامپیوتری
ICها به سه دسته تقسیم می شوند که عبارتند از:
- چیپ های آنالوگ
- آی سی های دیجیتال
- تراشه های سیگنال مختلط
در ادامه به توضیح بیشتر هریک از انواع آی سی می پردازیم.
آنالیز داده و استفاده از ابزارهای آماری و تحلیلی: متخصصین حوزههای دادهکاوی و هوش تجاری برای محاسبات آماری و نمایش گرافیکی دادهها از یک سری زبانهای برنامه نویسی خاص (مثل R) استفاده میکنند. امروزه بسیاری از شرکتهای بزرگ دنیا که با دادههای بزرگ سر و کار دارند برای تجزیه و تحلیل این دادهها متخصصین زبانهای برنامهنویسی تحلیل داده استخدام میکنند. شرکتهایی مثل فیسبوک، اوبر، گوگل، مایکروسافت و ... .
مدارهای مجتمع آنالوگ (آی سی آنالوگ)
در این نوع از آی سیها، ورودیها و خروجیها سیگنالهای پیوسته و متغیری هستند که در یک محدوده پیوسته کار میکنند. سطح سیگنال خروجی تابعی خطی از سطح سيگنال ورودی است (ولتاژها با یکدیگر نسبت مستقیم دارند). به همین دلیل است که به این نوع از مدارهاي مجتمع، "آی سیهای خطی" نیز میگویند.
آی سیهای خطی اغلب برای تقویت فرکانس استفاده میشوند. از نمونههای معروف این نوع چیپ میتوان به تنظیمکنندههای ولتاژ، تایمر، مقایسه کننده و تقویتکنندههای عملیاتی (Op-amp)، دمدولاسیون و مدولاسیون اشاره کرد. Op-ampها رایجترین نوع ICهای آنالوگ محسوب میشوند. آی سیهای خطی در تقویتکنندههای صوتی، سوئیپ فانکشن ژنراتور (Sweep Function Generator)، فیلترهای صوتی و نوسانسازها بسیار اهميت و کاربرد دارند.
مدارهای مجتمع دیجیتال (آی سی دیجیتال)
یک IC دیجیتال دارای تعداد محدودی از حالتهای ورودی و خروجی به صورت گسسته است. مدارهای دیجیتال را "آی سیهای غیر خطی" نیز مینامند زیرا روی سیگنالهای ناپیوسته کار میکنند.
ولتاژ ورودی و خروجی آی سیهای غیر خطی تنها داراي دو مقدار است؛ این مقادیر، ولتاژ "بالا – High – يک منطقی - روشن" یا ولتاژ "پايين – Low – صفر منطقی - خاموش"، با توجه به نوع مدار، خروجیهای متفاوتی را ميتوانند در مدار ايجاد کنند. از اين مدارها برای محاسبه و پياده سازی توابع بولی (Boolean) استفاده میشود، به عنوان مثال از اين تراشهها برای ساخت گیتهای منطقی مانند گیت AND، گیت OR، گیت NAND، گیت XOR، فلیپ فلاپ (Flip Flops) و شمارنده (Counter) استفاده میکنند. نمونه هایی از IC دیجیتال، میکروکنترلر ها و ریزپردازندهها است.
مدارهای مجتمعِ سیگنال مختلط (آی سی Mixed signal)
این طرحهای هیبریدی با ترکیب عناصر ICهای آنالوگ و دیجیتال به صورت مهندسی شده، ساخته میشوند. در واقعيت، آی سیهای مختلط همه جا هستند. این آی سیها امکان داشتن تراشههایی را فراهم میکنند که بهعنوان مبدل A/D (آنالوگ به دیجیتال)، مبدل D/A (دیجیتال به آنالوگ) و مدارهای زمانبندی ساعت (clock timing circuits) عمل میکنند. لازم به ذکر است که محاسبات مدرن بر اساس این تراشهها صورت میگيرند.
مزایا و معایب IC
مزایا | معایب |
---|---|
کوچک و سبک بودن | مستعد شکست (به دلیل احتمال آسیب فیزیکی، بازدهی کمتر از انتظار و..) |
مصرف انرژی مقرون به صرفه | احتیاج به تجهیزات و مهارت های تخصصی، برای تعمیر و تعویض |
مقاومت در برابر آسیب فیزیکی | هزینه طراحی و تولید بسیار بالا |
قابلیت تولید انبوه | منسوخ شدن |
ارائه سطوح بالای عملکرد | آسیب پذیر در مقابل تداخل مغناطیسی |
چه آیندهای در انتظار تراشهها است؟
بیشتر شرکتهای الکترونیک به دنبال کاهش سايز ترانزیستورها هستند، اما این مقیاسها نمیتوانند به طور نامحدود ادامه یابند. به نظر میرسد مدارهای نانو الکترونیکی (مدارهای ساخته شده با قطعاتی در مقیاس 10 نانومتر) امیدوارکننده ترین جانشین برای آی سیهای باشند. مدارهای با مقیاس مولکولی شامل دیودها، سوئیچهای بای استِیبِل (Bistable Switches) و نانوسیمها که در آزمایشگاههای شیمی ساخته شدهاند. تکنیکهای خود مونتاژ این دستگاهها در معماریهای مختلف نیز ارائه شده و برای ساخت نمونههای اولیه در مقیاس کوچک استفاده شده است که این دستگاهها و تکنیکهای مونتاژ منجر به تولید مدارهای الکترونیک در مقیاس نانو میشوند.
شما میتوانيد برای درک بهتر آينده پيش روی مدارهای مجتمع(IC)، به اين مقاله مراجعه کنيد.
سلام به همه شما دانش آموزان و دانشجویان عزیز، به کاملترین صفحهای که برای معرفی و بررسی الگوریتم در وب فارسی وجود داره خوش اومدید 😉
برای راحتی شما عزیزان برخی از قسمتهای مهم رو در زیر براتون لیست کردیم، روی هر کدوم از لینکهای زیر کلیک کنید صفحه به قسمت مورد نظر منتقل میشه، اما محتوای این صفحه فقط به همین موارد محدود نمیشه، و مواردی نظیر بررسی کاربرد الگوریتم در برنامه نویسی، پیچیدگی الگوریتم چیست، معرفی 26 الگوریتمی که هر برنامه نویسی باید از آن آگاه باشد، مزایا و معایب الگوریتم، بررسی تفاوت میان برنامه و انواع روشهای حل مسائل و ... در این صفحه وجود دارد. پس با ما همراه باشید.
- فیلم معرفی الگوریتم
- فیلم بررسی ویژگی هایی که یک الگوریتم باید داشته باشد
- فیلم تاریخچه الگوریتم
- فیلم کاربردهای الگوریتم در زندگی روزمره
- فیلم حل تشریحی تمرینها و مثالهای کتاب کار و فناوری دانش آموزان
- فلوچارت چیست و دانلود رایگان نرم افزار کشیدن فلوچارت
دانش الگوریتم از جمله علومی است که ایده ابداع آن از زندگی انسانها الگوبرداری شده است. اما چطور؟ مغز انسان برای انجام بسیاری از کارهای شخصی روزانه دارای الگوریتم مشخص و از پیش تعیین شده است و گاهی اوقات هم، ما بصورت کاملاً نا آگاهانه الگوریتم مشخصی را انتخاب و استفاده میکنیم. اما زمانیکه فعالیت ها و مسائل پیچیدهتر میشوند، بیش از هر زمان دیگری نیازمند یک برنامهای دقیق هستیم که بهترین عملکرد را داشته باشیم. در ادامه مقاله با ما همراه باشید تا شما را با شرح کامل و جامعی از علم الگوریتم آشنا کنیم و همچنین الگوریتم را به زبان ساده تعریف کنیم.
الگوریتم به زبان ساده
الگوریتم یعنی : برنامه ریزی جهت انجام صفر تا صد یک کار. یک الگوریتم شامل تعدادی ورودی و در نهایت یک خروجی است. شرط برقرار بودن یک الگوریتم این است که حتما در زمانی محدود، اجرا شود و به پایان برسد. هرکاری که در دنیای واقعی انجام میشود شامل یک الگوریتم است.
به عنوان مثال، الگوریتم زندگی روزانه یک انسان به این صورت است که صبح از خواب بیدار میشود، مسواک میزند، به محل کار میرود، به خانه بازمیگردد و در انتهای شب الگوریتم آن انسان پایان یافته و به خواب میرود. این موضوع در دنیای ماشینها بسیار حائز اهمیت است. تمام پردازندهها، سیستمعاملها، برنامههای کامپیوتری و ... براساس الگوریتمهای خاصی کار میکنند و به کاربر سرویس ارائه میدهند، در ادامه الگوریتم با جزئیات بیشتری مورد بررسی قرار میدهیم.
تعریف الگوریتم به زبان ساده
و اما الگوریتم در کامپیوتر چگونه تعریف میشود؟ در ریاضیات و علوم کامپیوتر، به مجموعهای از مراحل و فرآیندهای متوالی برای حل یک مسئله و یا انجام محاسبات، الگوریتم (Algorithm) گفته میشود. الگوریتمها فهرست دقیقی از دستورالعملها هستند که با ترتیب خاصی اجرا شده و خروجی مورد نظررا تولید میکنند. آنها میتوانند بسته به هدف شما، ساده یا پیچیده باشند.
شاید دستورالعمل پخت غذا و یا کیک مثال خوبی برای درک بهتر معنای الگوریتم باشد. یک آشپز برای طبخ غذای جدید، دستورالعمل و مراحل پخت را به ترتیب خوانده و آنها را یکی یکی و به ترتیب اجرا میکند. بهعلاوه اینکه در هر مرحله مواد مورد نیاز را تهیه و به غذا اضافه میکند (مواد را میتوان بعنوان ورودی در نظر گرفت) و نتیجه به دست آمده این است که غذای جدید (خروجی) کاملاً پخته و آماده سرو است.
در واقع شما هر بار که از تلفن، رایانه، لپ تاپ یا ماشین حساب خود استفاده میکنید، در پشت صحنه آن یک الگوریتم در حال خوانده شدن و اجرا شدن است. الگوریتم ها مستقل از زبانهای برنامهنویسی هستند، یعنی میتوانند در هر زبانی پیادهسازی و خروجی یکسانی داشته باشند و وظیفه یک فرد بعنوان برنامهنویس، آن است که الگوریتم را به برنامهای قابل اجرا در کامپیوتر تبدیل کند.
یک الگوریتم چگونه کار میکند؟
دنیای کامپیوتر پر از کلمات کلیدی مانند هوش مصنوعی، ابررایانه، یادگیری ماشین، محاسبات کوانتومی و خیلی از لغات دیگر است اما شاید در این میان، کلمه الگوریتم جزو پرتکرار ترین ها در علم کامپیوتر باشد.
در کلیترین مفهوم، یک الگوریتم مجموعهای از دستورالعملها است که به رایانه میگوید، چگونه مجموعهای از حقایق جهان را، به اطلاعات مفید تبدیل کند. مرتب سازی مجموعه اعداد گرفته شده، یافتن مسیرها از طریق نقشه و حتی نمایش اطلاعات بر روی صفحه نمایش نمونههایی از اجرای یک الگوریتم خاص هستند.
پوشیدن لباس در هنگام صبح و آماده شدن برای رفتن به محل کار و یا دانشگاه یکی از مثالهایی است که از اجرای یک الگوریتم ساده در مغز انسان نشأت میگیرد. اما اگر قرار باشد این روند را یادداشت کنید و به یک کودک 5 ساله آموزش دهید، چگونه آن را انجام میدادید؟ پاسخ این سوال به روشی دقیق، ساختار الگوریتم را تشکیل میدهد.
در فیلم زیر الگوریتم بصورت ساده توضیح داده شده است، سپس در مورد ورودی و خروجیهای الگوریتم و نحوه رسم فلوچارت یک الگوریتم صحبت شده است و در آخر مثال ساده ای از الگوریتم زده شده و همین طور فلوچارت الگوریتم رسم شده است
مراحل نوشتن یک الگوریتم را میتوان به سه بخش تعریف ورودی، انجام محاسبات و نمایش خروجی تقسیم کرد.
تعریف ورودی الگوریتم (Input)
ورودیها اطلاعاتی هستند که یک الگوریتم در هنگام تصمیم گیری به آنها نیاز دارد. وقتی صبح میخواهید لباس بپوشید به چه اطلاعاتی نیاز دارید؟ قبل از هر چیز باید بدانید چه لباسهایی در کمدتان در دسترس شماست و بعد از آن مواردی مانند دما، پیشبینی آب و هوا در طول روز و یا حتی برخی از ترجیحات شخصی را در انتخاب لباستان در نظر میگیرید.
همه این موارد بعنوان ورودی یک الگوریتم در نظر گرفته میشوند. در برنامه نویسیبرنامه نویسی کامپیوتر چیست و چطور می توانید یک برنامه نویس موفق شوید؟در عصر فعلی برنامهنویسی یکی از پرطرفدارترین شغلهای دنیاست، دغدغهای افرادی که میخواهند در مسیر برنامهنویس شدن قدم بردارند این است که نمیدانند از کجا باید شروع کنند، در این صفحه هر آن چه برای تبدیل شدن به یک برنامه نویس حرفه ای نیاز دارید در اختیارتان قرار گرفته است، ورودیها اغلب به صورت مجموعههای سادهای از اعداد، کلمات (رشته) و یا انواع مختلف دیگری از دادهها تعریف میشوند. برای مثال، دما یک عدد است و پیشبینی آب و هوا ممکن است کلماتی مانند «بارانی» یا «آفتابی» باشد.
مرحله محاسبات در الگوریتم
در ساختار یک الگوریتم، واحد محاسبات قلب الگوریتم نامیده میشود. این بخش شامل سه بخش محاسبات ریاضی، تصمیمگیری (شرطی) و تکرار است. اما این بخش برای مثال لباس پوشیدن چگونه بیان میشود؟ اینکه کت بپوشید ممکن است به دما بستگی داشته باشد و اینکه کدام ژاکت را انتخاب کنید ممکن است به پیش بینی هوا در طول روز وابسته باشد (واحد محاسبات) . به زبان کامپیوتر، بخشی از الگوریتم لباس پوشیدن اینگونه بیان میشود "اگر هوا زیر 25 درجه است و باران می بارد، یک کت بارانی و پیراهنی آستین بلند برای پوشیدن زیر آن انتخاب کن. (واحد تصمیمگیری)
نمایش خروجی الگوریتم (Output)
در نهایت، آخرین مرحله یک الگوریتم بیان پاسخ یا خروجی است. خروجیها نیز همانند ورودی به صورت انواع مختلفی از دادهها بیان میشوند و در مواردی ممکن است، خروجی یک الگوریتم بعنوان ورودی الگوریتم دیگری بکار گرفته شود و بدین ترتیب میتوان الگوریتم های بزرگ تر را سازماندهی کرد و برای مسائل پیچیده پاسخی مناسب یافت.
حال اگر به مثال خودمان برگردیم، خروجی پوشیدن لباس را میتوان در قالب نظر یک همکار در مورد زیبایی لباستان و یا نگاه اطرافیان به شما بیان کرد. حتی اگر روز کاری بر وفق مرادتان پیش رود ممکن است یک عکس سلفی هم بگیرید و آن را بر روی شبکههای اجتماعی مانند اینستاگرام قرار دهید و بازخورد آن را بعنوان خروجی در نظر بگیرید.
مثال الگوریتم
فهمیدن مفهوم الگوریتم بسیار مهم است، در خصوص اهمیت آن همین بس که اشاره کنیم که در کشور ما آموزش مفهوم الگوریتم از ششم دبستان و در درس کار و فناوری شروع میشود. بنابراین برای اینکه سادهتر و عمیقتر با مفهوم الگوریتم آشنا شوید، برای شما فیلمهایی آماده کردیم که در آنها مثالهای سادهای از الگوریتمها و آوردهایم، همین طور فلوچارت این الگوریتمها رسم شده است.
مثال 1: الگوریتمی و فلوچارتی که دو عدد را دریافت میکند و نشان میدهد کدام عدد بزرگتر است.
مثال 2: الگوریتم و فلوچارتی که یک عدد را دریافت کند و به ما بگوید که آن عدد زوج است یا فرد.
فلوچارتهایی که در فیلمهای بالا رسم شده است با استفاده از نرم افزار EdrawMax رسم شده است، که میتوانید این نرم افزار را در همین صفحه و در قسمت آموزش فلوچارت بصورت رایگان دانلود کنید و از آن استفاده کنید.
برای مشاهده مثال های بیشتری از الگوریتم و رسم فلوچارت روی لینک زیر کلیک کنید:
تعریف پیشرفته تری از الگوریتم
در فیلم زیر تعریف علمیتر و دقیقتری از الگوریتم آورده شده است
ویژگی های الگوریتم چیست؟
برای نوشتن یک الگوریتم لازم است استانداردهایی رعایت شود تا بهترین عملکرد و بهینهترین پاسخ را حاصل شود. به طور مشخص برای هر الگوریتم، شش ویژگی در نظر گرفته شده که با جنبههای مختلفی از آن سروکار دارد. در ادامه هریک از ویژگی های الگوریتم را بطور مجزا مورد بحث قرار دادهایم. همچنین فیلمی در زیر در اختیار شما عزیزان قرار دادهایم که به بررسی چه ویژگیها و خواصی که یک الگوریتم باید داشته باشد، میپردازد.
- ورودی مشخص :
ورودی، داده ای است که طی محاسبات کامپیوتر برای تولید خروجی، تغییر شکل میدهد. در صورتی که الگوریتم به ورودی نیاز داشته باشد، ورودی ها باید به خوبی تعریف شوند؛ بدین معنا که نوع داده، مقدار آن و نحوه ورود داده به الگوریتم، مشخص شود.
- خروجی مشخص :
خروجی، داده ای است که از محاسبات انجام شده توسط الگوریتم، حاصل میشود. یک الگوریتم باید حداقل یک خروجی تعریف شده، مطابق با خروجی مورد نظر داشته باشد. سنجش دقت خروجی، مستلزم دانستن اطلاعاتی نظیر نوع داده، مقدار و نحوه نمایش آن است. (اگر الگوریتم دارای چند خروجی باشد باید خصوصیات هریک از آنها به طور کاملاُ مشخص تعیین شده باشد.)
- قطعیت :
الگوریتم، باید دارای قطعیت باشد. یعنی باید هر مرحله، و همچنین ترتیب مراحل را به طور دقیق مشخص کند. قطعیت، به معنی مشخص بودن توالی اعمالی است، که به منظور تبدیل ورودی به خروجی، انجام میشوند. الگوریتم باید واضح و بدون ابهام باشد؛ جرئیات هر مرحله (از جمله نحوه رسیدگی به خطاها) باید تعیین شود. در الگوریتم همه چیز باید کمی باشد و نه کیفی. اگر خودتان در مورد آن ابهام دارید، نمی توانید انتظار داشته باشید که کامپیوتر چیزی را بفهمد!
- کارایی :
کارا بودن الگوریتم، مستلزم آن است که تمامی مراحل آن، با استفاده از امکانات موجود، قابل اجرا باشند و نباید شامل هیچگونه مرحله غیر ضروری یا اضافی، که ممکن است منجر به ناکارآمدی الگوریتم شود، باشد.
برای مثال، فرض کنید که در حال آشپزی هستید. خورد کردن سبزی هایی که در دستور پخت نیستند، اتلاف وقت خواهد بود. - متناهی بودن :
هر الگوریتمی باید در نهایت متوقف شود و توقف به این معناست که یا الگوریتم خروجی مورد انتظار را تولید کرده و یا جوابی برای آن مسئله پیدا نکرده است. بهرحال الگوریتم ها بایستی پس از طی تعداد محدودی از مراحل خاتمه پیدا کنند و زمان اجرای آنها محدود باشد.
- مستقل از زبان :
الگوریتم طراحیشده، باید بصورت مجموعهای از دستورالعملهای سادهای باشد که قابلیت پیادهسازی در هر زبان برنامهنویسی را داشته باشند.یعنی فارغ از زبان برنامه نویسی، خروجی مطلوب را تولید کند.
ویژگی هایی که یک الگوریتم باید داشته باشد در یک نگاه
برای طراحی یک الگوریتم برای یک مسئله چه مراحلی را باید طی کنیم؟
در فیلم زیر به بررسی مراحلی که برای طراحی یک الگوریتم باید طی شود پرداختهایم.
پیچیدگی الگوریتم چیست؟
اساسا هر الگوریتمی، برای اجرا نیاز به زمان دارد و همچنین علاوه برزمان، فضاهایی را در حافظه اشغال میکند. یکی از چالشهای بزرگ در حوزه الگوریتم، نوشتن الگوریتمهایی با پیچیدگی زمانی پایین است. هرچه پیچیدگی زمانی الگوریتم را کاهش دهیم، سرعت اجرای الگوریتم ها بیشتر خواهد شد. پس دونوع پیچیدگی درالگوریتم داریم.
- پیچیدگی زمانی الگوریتم : همانطور که بیان شد، این مورد عبارت است از میزان زمان مورد نیاز برای اجرای یک الگوریتم.
- پیچیدگی مکانی الگوریتم : هرالگوریتمی که در کامپیوتر اجرا میشود، نیاز به حافظه دارد و یک فضایی را در حافظه اشغال میکند. حال میزان حافظهای که اشغال میشود، باعنوان پیچیدگی مکانی الگوریتم مطرح میشود.
الگوریتم در کامپیوتر
همانطور که اشاره شد، الگوریتم ها در کامپیوتر نقش اساسی دراجرای یک برنامه را دارند. هنگامی که شما از کامپیوتر شخصی استفاده میکنید و یا همین الان که در حال خواندن این مطالب هستید، اجزای کامپیوتری شما براساس الگوریتمهای سختافزاری فعالیت میکنند و به شما سرویسهایی از قبیل، پردازش گرافیکی، پردازش نرمافزار و ... را ارائه میدهند. این اجزا براساس الگوریتم های خاصی فعالیت میکنند که از قبل برای آنها تعریف شده است.
کاربرد الگوریتم در برنامه نویسی
برنامهنویسی، درواقع واسطی بین انسانها و ماشینهاست. انسانها برای اینکه به ماشینها وظایفی را واگذار کنند، نیاز دارند تا خواستههای خودرا برای ماشین بیان کنند. بیان این خواستهها از طریق زبانهای برنامهنویسی تحقق مییابد.
الگوریتم در برنامه نویسی بسیار فراوان دیده میشود. یک برنامهنویس از هر زبانی که استفاده کند، براساس الگوریتمهای خاصی برنامهی خودرا مینویسد و آن الگوریتم، توسط آن زبان، برای ماشین ترجمه میشود و ماشین آن الگوریتم را اجرا میکند. بنابراین برنامهنویسی برپایه الگوریتم انجام میشود و یک برنامهنویس، باید در حوزه الگوریتم دانش و تحلیل خوبی داشته باشد.
یک برنامه مانند اینستاگرام یا فتوشاپ یا ... از کنار هم قرارگیری الگوریتمهای بسیاری ساخته شده است. این الگوریتمها میتوانند با هر زبان برنامه نویسیای نوشته شوند، بنابراین آنچه که قلب یک برنامه را تشکیل میدهد و آنچه که مهم است الگوریتمها هستند، نه زبان برنامه نویسی!
الگوریتم در ریاضی
الگوریتم در ریاضی کاربرد بسیار فراوانی دارد و یا بهتر است بگوییم که ریاضیات در الگوریتم کاربرد فراوانی دارد. درواقع مسائل بسیار زیادی در زیادی را میتوان توسط الگوریتمها پیادهسازی کرد. همچنین این الگوریتمها برپایهی ریاضیات ساخته شدهاند. این ارتباط دو طرفه بین ریاضیات و الگوریتم، دنیای جذابی در حوزهی computation خلق کرده است. مسائل بسیار زیادی در ریاضی، توسط الگوریتمهای ماشین پیادهسازی میشوند که نمونههایی از آن به شرح زیر هستند :
- محاسبه توابع مثلثاتی توسط بسط تیلور
- ضرب ماتریس توسط الگوریتمهای با مرتبه زمانی پایین
- وارون مارتیس توسط روشهای تجزیه ماتریس (روشهای عددی)
- محاسبهی n معادله و n مجهول توسط روش حذف گاوس جردن
- الگوریتمهای تصادفی برای محاسبه مجهولات ماتریسی
چرا یادگیری الگوریتم ها و نحوه استفاده از آنها مهم است؟
در طول تاریخ علم کامپیوتر، الگوریتمها و ساختمانهای داده همواره جزو اساسیترین بخشهای حوزه برنامهنویسی محسوب شده و هر توسعهدهندهای برای حل مسائل ضرروری به آنها نیازمند است.
تصور کنید برای اینکه به رستوان مورد علاقهتان بروید و غذا سفارش دهید سه مسیر مختلف وجود دارد: عبور از پیادهرویی که در امتداد بزرگراه است (راه طولانی و خطرناکی دارد)، عبور از کوچه پس کوچهها (مسیر سریع اما همچنان خطرناک) و یا استفاده از تاکسی (سریع و ایمن اما باید هزینه بپردازید). باز حتی ممکن است راهحلهای متفاوت دیگری نیز برای این مسئله وجود داشته باشد. مثلاً از خودروی شخصیتان استفاده کنید و به رستوران بروید و یا حتی بصورت تلفنی سفارش بدهید و منتظر پیک رستوران بمانید. در نهایت نکته حائز اهمیت این است که شما موثرترین راه را برای دریافت غذای خود پیدا کنید.
یک برنامه نویسبرنامه نویسی کامپیوتر چیست و چطور می توانید یک برنامه نویس موفق شوید؟در عصر فعلی برنامهنویسی یکی از پرطرفدارترین شغلهای دنیاست، دغدغهای افرادی که میخواهند در مسیر برنامهنویس شدن قدم بردارند این است که نمیدانند از کجا باید شروع کنند، در این صفحه هر آن چه برای تبدیل شدن به یک برنامه نویس حرفه ای نیاز دارید در اختیارتان قرار گرفته است موفق همواره بهدنبال مؤثرترین و سریعترین راهحل ممکن است یعنی امکان اجرای سریع و بدون وقفه برنامه، میزان حافظه موردنیاز، سهولت در پیادهسازی و اجرای طرح و حتی برآورد و تخمین هزینههای انجام شده برای دریافت نسخه نهایی از مواردی است که یک برنامه نویس باید به آنها آگاه باشد.
به عنوان مثال، شما میخواهید یک آرایه از n عدد را به ترتیب صعودی مرتب کنید.
این خیلی ساده به نظر می رسد!
ابتدا کل آرایه را نگاه میکنید، کوچکترین عدد را پیدا کرده و آن را با اولین عنصر آرایه عوض میکنید. اگر با آرایه آشنایی ندارید برای آشنایی بیشتر میتوانید به صفحه آموزش آرایه در ساختمان داده مراجعه کنید.
درمرحله بعد، اعداد را از عنصر دوم بررسی کرده و کوچکترین عدد را انتخاب میکنید و آن را با عنصر دوم آرایه عوض میکنید، و به همین ترتیب این فرآیند را n بار تکرار خواهید کرد. به این روش، مرتبسازی انتخابی میگویند و قطعاً خروجی این الگوریتم شامل اعداد مرتبشده خواهد بود اما زمان زیادی را صرف مرتبسازی میکند و اگر آرایه حاوی چند میلیارد عدد باشد، مدت زمان اجرای برنامه بطور قابل توجهی طولانی خواهد بود. اما برای اینکه بفهمیم کدام الگوریتم مناسبتر و کارآمدتر عمل خواهد کرد، باید به نحوه عملکرد سایر الگوریتمهای مرتبسازی آگاه باشیم.
بنابراین دانستن و درک کامل مسئله و قدرت تجزیه و تحیل به شما کمک میکند تا بفهمید که چرا راه حل X بهتر از راه حل Y است و هنگامی که متناسب با ساختار مسئله مناسبترین و کارآمدترین الگوریتمها را انتخاب کردید، میتوانید الگوریتم های خود را نوشته و یا برای حل مسائل پیچیدهتر آنها را با یکدیگر ترکیب کنید.
الگوریتم ها به شما کمک می کنند تا شغلی پیدا کنید
بزرگترین شرکتهای فناوری مانند گوگل، فیسبوک و آمازون برای استخدام افراد متخصص و ماهر، مصاحبههای جداگانهای انجام میدهند که به طور خاص بر ساختار دادهها و الگوریتمها متمرکز است. این شرکتها برای تامین نیروی انسانی خود به دنبال اشخاصی هستند که با بکارگیری موثرترین الگوریتمها، برنامهها و نرمافزارها را به گونهای طراحی و پیادهسازی کنند که علاوه بر صرفهجویی در منابع شرکت (قدرت محاسباتی، سرورها، پول و غیره) بشود آنها را به سرعت ارائه و یا روانه بازار کرد. یکی از نمونه سوالهایی که انتظار میرود در هنگام مصاحبه با این شرکتها بشنوید، ممکن است چیزی شبیه به این باشد:
فرد مصاحبهکننده از شما انتظار دارد که علاوه بر ارائه راهحل برای مسئله، در خصوص اینکه چرا الگوریتم A را به الگوریتم B ترجیح دادهاید نیز توضیحاتی بیان کنید.
وظیفه اصلی یک توسعه دهنده، تجزیه و تحلیل و حل مسائل گوناگون است چرا که مهمترین و اصلیترین ابزار برای رسیدن به یک هدف نهایی است. موتور جستجوی گوگل (Google) اگر به خاطر استفاده منحصر به فرد و پیشگامانهاش از الگوریتم ها نبود، به این میزان کاربردی و پرطرفدار و البته پولساز نبود. گوگل در حال حاضر بیش از 91 درصد از بازار جهانی موتورهای جستجو را در اختیار دارد و این بیش از دو تریلیون جستجو در هر سال است! در روزهایی که سایر موتورهای جستجو صرفاً به دنبال کلمات کلیدی بودند، گوگل متوجه شد که آنچه واقعاً اهمیت دارد ارتباط میان کلمات و افراد است. یافتن این ارتباطات و بروزرسانی آنها، اساس کار الگوریتمهای Google است و با استفاده از نتایج بدست آمده؛ تایپ یک کاربر در موتور جستجو را پیش بینی کرده و هزاران موضوع مرتبط دیگر را به او پیشنهاد میدهد.
الگوریتم ها به آموزش مغز شما کمک می کنند
زمانی که شروع به درک ساختار الگوریتم ها کنید، احتمالاً متوجه خواهید شد که فقط از آنها در محل کار استفاده نمیکنید بلکه آنها به یک جفت کفش ورزشی خوب برای دویدن و تمرین دادن مغزتان تبدیل شدهاند.
استیو جابز : "همه باید برنامه نویسی کامپیوتر را یاد بگیرند، زیرا به شما یاد خواهد داد که چگونه فکر کنید."
تقریباً در هر بخش از زندگی روزمرهتان میتوانید با ایجاد یک ساختار منطقی در وقتتان صرفهجویی کنید و عملکردتان را بهبود ببخشید تا نتایج بهینهتری را کسب کنید. الگوریتمها ابزار قدرتمندی هستند که به شما یاد میدهند که چگونه افکار خود را بیان کنید و برای مسائلی که غیرقابل حل بنظر میرسند بهترین پاسخ را بیابید.
وبسایت های بسیار خوبی در زمینه تمرین و افزایش مهارت های حل الگوریتم وجود دارد که بازدید و بررسی آنها را به شما پیشنهاد میکنیم:
Codewars، LeetCode، Project Euler، HackerRank
الگوریتم در برنامه نویسی چیست؟
در واقعیت، پردازنده یک کامپیوتر به طور مداوم در حال انجام محاسبات ریاضی است و مسائل زیادی برای حل کردن دارد. دقیقاْ به همین دلیل است که الگوریتم ها را قلب علم کامپیوتر میدانند. الگوریتم کامپیوتری یک روش محاسباتی است که مجموعهای محدود از ورودیها را دریافت کرده و با انجام اندکی محاسبات ریاضی و منطق، خروجی مورد نظر را تولید میکند. یک الگوریتم در برنامه نویسی چندین مرحله به شرح زیر دارد:
- تعریف مسئله
- جمع آوری داده ها
- پردازش داده (درک آنکه چه دادههایی دارد و یا آنها را به فرمی درآورد که قابل استفاده باشد)
- رویکرد منطقی : بکارگرفتن دادههای جمعآوری یا تولید شده در جهت منطق حل مسئله
- راه حل: نمایش راه حل ارائه شده در قالب گرافیک یا نمودار و یا یک چارت
به طور کلی، یک الگوریتم با توجه به مقدار ورودی X، آن را به مقدار خروجی Y تبدیل میکند. اگر آن را به صورت ریاضی بخواهیم بیان کنیم، یک الگوریتم دقیقا تابعی مانند f در نظر گرفته می شود که Y خروجی مورد نظر آن است: y = f(x)
26 الگوریتمی که هر برنامهنویسی باید از آنها آگاه باشد
داشتن دانش خوب و کافی از الگوریتمهای استاندارد به اندازه انتخاب یک ساختمان داده مناسب قابل اهمیت است. لیستی از ۲۵ الگوریتم برتر که هر برنامه نویس و دانشجوی علوم کامپیوتر باید بداند در زیر آمده است.
- الگوریتم جستجو دودویی (Binary Search)
- الگوریتم جستجوی سطح اول (Breadth First Search (BFS))
- الگوریتم جستجوی عمق اول (Depth First Search (DFS))
- مرتب سازی ادغامیآموزش مرتب سازی ادغامی بصورت 0 تا 100این صفحه مرتب سازی ادغامی را بصورت 0 تا 100 آموزش داده و مثال مرتب سازی ادغامی آورده شده است، همچنین بهترین، متوسط و بدترین حالت مرتب سازی ادغامی بررسی شده
- مرتب سازی سریعآموزش مرتب سازی سریع بصورت 0 تا 100این صفحه مرتب سازی سریع را بصورت 0 تا 100 آموزش داده و مثال مرتب سازی سریع آورده شده است، همچنین بهترین، متوسط و بدترین حالت مرتب سازی سریع بررسی شده
- الگوریتم Kruskal
- الگوریتم فلوید وارشال (Floyd Warshall)
- الگوریتم دایجستراالگوریتم دایجسترا (Dijkstra) از 0 تا 100 - الگوریتم دایکسترااین صفحه الگوریتم دایجسترا (Dijkstra) (یا همان الگوریتم دایکسترا) را از 0 تا 100 بررسی کرده، همین طور به پیاده سازی و آموزش الگوریتم دایجسترا پرداخته است. (Dijkstra)
- الگوریتم بلمن فورد (Bellman Ford)
- الگوریتم ژنتیکالگوریتم ژنتیک از 0 تا 100، آموزش الگوریتم ژنتیک در متلباین صفحه الگوریتم ژنتیک (Genetic Algorithm) را از 0 تا 100 بررسی کرده، همین طور به پیاده سازی و آموزش الگوریتم ژنتیک در متلب (MATLAB) پرداخته است.
- الگوریتم Flood Fill
- الگوریتم تشخیص چرخه فلوید (Floyd’s Cycle Detection)
- الگوریتم Union Find
- الگوریتم مرتب سازی توپولوژیکی (Topological Sort)
- الگوریتم KMP
- الگوریتم مرتب سازی درجی (Insertion Sort)
- الگوریتم مرتب سازی انتخابی (Selection Sort)
- الگوریتم مرتبسازی شمارشی (Counting Sort)
- الگوریتم مرتبسازی هیپ (Heap Sort)
- الگوریتم مرتب سازی توپولوژیکی Kahn
- الگوریتم فشردهسازی کد هافمن (Huffman Coding Compression)
- الگوریتم انتخاب سریع (Quickselect)
- الگوریتم رأی اکثریت Boyer – Moore
- الگوریتم اویلر (Euclid)
- الگوریتم اقلیدسی
- مرتب سازی حبابیآموزش مرتب سازی حبابی (Bubble Sort) بصورت 0 تا 100این صفحه مرتب سازی حبابی (Bubble Sort) را بصورت 0 تا 100 آموزش داده و کدهای مرتب سازی حبابی در C++، پایتون و جاوا آورده شده است شده
الگوریتمهای معروفی در حوزه هوش مصنوعی مانند الگوریتم ژنتیکالگوریتم ژنتیک از 0 تا 100، آموزش الگوریتم ژنتیک در متلباین صفحه الگوریتم ژنتیک (Genetic Algorithm) را از 0 تا 100 بررسی کرده، همین طور به پیاده سازی و آموزش الگوریتم ژنتیک در متلب (MATLAB) پرداخته است.، الگوریتمهای یادگیری ماشین و ... هستند که میتوانید دربارهی هرکدام از آنها بطور جداگانه تحقیق کنید.
قبل از یادگیری الگوریتم چه چیزهایی را باید بدانیم؟
بهتر است قبل از یادگیری الگوریتم ها در علوم کامپیوتر، درک خوبی از مفاهیم برنامه نویسی مانند متغیرها، توابع، کلاسها و به ویژه مفاهیم برنامه نویسی شیگرا (OOP: Object Oriented Programming) داشته باشید. موارد بیان شده به عنوان مفاهیم پایه در نظر گرفته میشوند و در ادامه برای درک مطالب پیچیده و پیشرفتهتر در علوم کامپیوتر به آنها نیاز خواهید داشت.
ابزارهای نمایش الگوریتم به شرح زیر هستند :
فلوچارت چیست؟ (Flowchart)
فلوچارت، نموداری است که بهوسیله آن میتوان یک سیستم یا الگوریتم کامپیوتری را بصورت بصری و قابل فهم به تصویر کشید. فلوچارتها به طور گسترده در زمینههای مختلف برای مستندسازی، مطالعه، برنامهریزی، بهبود و ارتباط فرآیندهای اغلب پیچیده در نمودارهای واضح و قابل فهم استفاده میشوند. از اشکال هندسی مانند مستطیل، بیضی، لوزی و شکلهای متعدد دیگری برای تعیین نوع گام و فلشهای متصل میان آنها برای تعریف جریان و ترتیب استفاده میکنند. فلوچارتها بر اساس کاربردشان گاه بصورت نمودارهایی ساده و دستی، و گاهی به شکل نمودارهای پیچیده با مراحل و مسیرهای متعددی نشان داده میشوند. این نمودارها یکی از رایج ترین نمودارها در جهان هستند که توسط افراد فنی و غیرفنی در زمینههای متعددی استفاده میشوند. فلوچارتها گاهی اوقات با نامهای تخصصی تری مانند نمودار جریان فرآیند (PFD)، نقشه فرآیند و یا نمودار جریان عملکرد نامیده میشوند.
به عنوان یک نمایش بصری جریان داده (DFD)، فلوچارتها در نوشتن یک برنامه یا الگوریتم و توضیح آن برای دیگران و شکل گرفتن همکاری میان افراد مفید هستند. شما میتوانید از فلوچارت الگوریتمی برای بیان منطق پشت برنامه قبل از شروع به کدنویسی استفاده کنید. این نمودار میتواند به سازماندهی ذهن کمک کرده و در زمان رسیدن به مرحله کدنویسی، راهنمای موثری باشد.به طور خاصتر، فلوچارتها میتوانند :
- نحوه سازماندهی کد را نشان دهند.
- اجرای کد را در یک برنامه تجسم کنند.
- ساختار یک وبسایت یا برنامه را نشان دهند.
- نحوه حرکت کاربران در یک وب سایت یا برنامه را متوجه شوند.
نمادهای رایج فلوچارت
نقطه شروع و پایان
واحد پردازش
واحد تصمیمگیری
دادههای ورودی/خروجی
جهت/جریان
مستندات
پایگاهداده
دانلود نرم افزار رسم فلوچارت EdrawMax
در زیر میتوانید بصورت رایگان و براحتی نرم افزار EdraMax که برای رسم فلوچارت استفاده میشود و ابزار بسیار سادهای است را نصب و از کرک شده آن استفاده کنید. در فیلمهایی که در ابتدای این صفحه قرار گرفته و در آنها چندین مثال از بیان الگوریتم و رسم فلوچارت حل شده است از این اپلیکیشن استفاده شده است.
〈〈 دانلود نرم افزار رسم فلوچارت〉〉
آموزش نصب و فعال سازی نرم افزار رسم فلوچارت رایگان قرار گرفته
- دسترسی به اینترنت را قطع کنید.
- فایل را از حالت فشرده خارج کنید.
- نرم افزار را نصب کنید ، اما اجرا نکنید.
- فایل موجود در پوشه Crack را در مسیری که نرم افزار نصب شده است کپی کنید.
- نرم افزار را اجرا کنید.
- برای جلوگیری از غیرفعال شدن کرک، نرم افزار را در فایروال آنتی ویروس یا ویندوز قرار بدید
فلوچارتهای معروف در حوزه نرمافزار کامپیوتر
فلوچارت های معروف به شرح زیر هستند :
- زبان مدل سازی یکپارچه (UML) : یک زبان همه منظوره است که در مهندسی نرم افزار برای مدلسازی استفاده می شود.
- نمودارهای Nassi-Shneiderman : در برنامهنویسی کامپیوتر یک نمایش گرافیکی برای برنامه نویسی ساخت یافته است. این نوع نمودار در سال 1972 توسط ایزاک ناسی و بن اشنایدرمن که هر دو دانشجوی کارشناسی ارشد دانشگاه استونی بروک بودند توسعه یافت.
- نمودارهای DRAKON : یک زبان برنامه نویسی بصری الگوریتمی است که برای تولید فلوچارت استفاده می شود.
شبه کد (Pseudocode)
در علوم کامپیوتر، شبهکدها توصیفی ساده از مراحل یک الگوریتم هستند. برخلاف زبانهای برنامهنویسی از دستور خاصی تبعیت نمیکنند و بر روی کامپیوتر قابل اجرا نیستند. این شبهکدها برای درک راحت انسان از مراحل الگوریتم در نظر گرفته شدهاند و جزئیاتی را که برای درک ماشینی ضروری هستند، مانند تعریف متغیر و توابع خاص حذف میکنند. شبه کدها توصیفی کارآمد و مستقل از محیط و اصول کلیدی یک الگوریتم هستند و درک آن برای یک آماتور و یا برنامهنویس سادهتر است. معمولاً از شبهکدها (کدهای کاذب) در کتابهای درسی و انتشارات علمی برای مستندسازی الگوریتمها استفاده میشود. شبهکدها عموماً از قوانین نحوی هیچ زبان خاصی پیروی نمیکنند و هیچ فرم استاندارد سیستماتیکی برای آنهاوجود ندارد. برخی از نویسندگان شبهکدها در سبک و نحو نگارش خود از ساختارهای کنترلی (while, If then else, Repeat until, for) برخی زبانهای برنامهنویسی مانند Java،Lisp وFortran، Pascal، BASIC، C، C++ وALGOL استفاده میکنند. فراخوانی توابع و بلوکها مانند کدهای موجود در یک حلقه، اغلب با یک جمله به زبان طبیعی یک خطی جایگزین می شوند.
مزایا و معایب الگوریتم
مزایای الگوریتم به شرح زیر است :
- نمایش گام به گام راهحل یک مسئله را بیان و درک آن را آسان میکند.
- از رویه و استاندارهای مشخصی پیروی میکند.
- به هیچ زبان برنامه نویسی وابسته نیست و برای همه افراد حتی آنهایی که دانش برنامهنویسی ندارند قابل فهم و آسان است.
- هر مرحله در یک الگوریتم، دنباله منطقی خاص خود را دارد و اشکال زدایی آن آسان است.
- با استفاده از الگوریتم، مسئله به قطعات یا مراحل کوچکتر تقسیم میشود و برای برنامهنویس آسانتر است که آن را به یک برنامه واقعی تبدیل کند.
معایب الگوریتم به شرح زیر است :
- الگوریتمها زمان بر هستند.
- نشان دادن انشعاب و حلقه زدن در الگوریتمها مشکل است.
- قرار دادن وظایف بزرگ در الگوریتم ها دشوار است.
کدام را اول یاد بگیرید: ساختمان داده یا الگوریتم؟
ساختمان داده و الگوریتم به یکدیگر وابستهاند؛ ما از یک ساختمان داده مناسب برای اعمال الگوریتمها و به طور مشابه، الگوریتمها را در ساختمان دادهها اعمال میکنیم. از این تعریف مشخص است که ساختمانداده، دادههای بدون ساختار را به شکل سازمان یافته ذخیره میکند در حالیکه الگوریتمها مجموعه دستورالعملهایی هستند که یک کامپیوتر برای حل یک مسئله خاص از آنها پیروی میکند. اما طبق نظر مدرسین و دانشمندان علوم کامپیوتر، بهتر است در ابتدا دانشآموزان مفاهیم مربوط به ساختمان دادهها را فرا گیرند و قبل از آنکه در یادگیری مطالب به صورت پیشرفته عمیق شوند، آموزش الگوریتمها را شروع کرده و هردو را به صورت همزمان پیش ببرند. از اینرو یک مهندس و متخصص کامپیوتر برای داشتن یک عملکرد حرفهای و گرفتن بهترین نتایج، ضروری است که هم به دانش ساختمان داده و هم الگوریتم مسلط باشد. برای مطالعه بیشتر در مورد ساختمان داده میتوانید به صفحه آموزش ساختمان دادهآموزش ساختمان داده و الگوریتمهر ساختمان داده یک نوع فرمت ذخیرهسازی و مدیریت دادهها در کامپیوتر است، که امکان دسترسی و اصلاح کارآمد آن دادهها را برای یکسری از الگوریتمها و کاربردها فراهم میکند، در این صفحه به بررسی و آموزش ساختمان داده و الگوریتم پرداخته شده است مراجعه کنید.
ساختمانهای داده، بلوکهای سازنده الگوریتمها هستند و الگوریتمها بسترهایی هستند که ساختمان دادهها بر روی آن ها اعمال و آزمایش میشوند.
تفاوت میان الگوریتم و برنامه
الگوریتمهای کامپیوتری مسائل را حل میکنند در حالیکه برنامهها، الگوریتمها را به شکلی پیادهسازی میکنند که کامپیوتر بتواند آنها را اجرا کند. در جدول زیر تفاوتهای اصلی بین الگوریتم و برنامه بیان شده است:
برنامه (Program) | الگوریتم (Algorithm) |
---|---|
به مجموعهای از دستورالعملها اشاره دارد که یک کامپیوتر دنبال میکند. یک برنامه میتواند شامل پیادهسازی چندین الگوریتم و یا حتی فاقد الگوریتم باشد. | یک روش کاملاً تعریف شده، گام به گام و منطقی برای حل یک مسئله معین است. |
اجزای یک برنامه ممکن است از نظر مفهومی مرتبط نباشند. | یک الگوریتم، مراحل انتزاعی و مفهومی را برای پردازش اطلاعات فراهم میکند. |
بسته به وظیفه خاصی که برنامه برای آن طراحی شده، میتواند به هر زبان برنامهنویسی مانند پایتون، جاوا، C++، جاوا اسکریپت و یا هر زبان دیگری نوشته شود. | الگوریتمها با استفاده از یک زبان محاورهای ساده نوشته میشوند و برای افرادی که دانش برنامه نویسی نیز ندارند، قابل درک هستند. |
ما برنامههای کامپیوتری را به زبان کامپیوتر مینویسیم و سپس یک کامپایلر یا مترجم آن را به زبانی ترجمه میکند که برای هر سیستم کامپیوتری قابل درک باشد. | الگوریتمها را میتوان به زبان طبیعی، فلوچارت ، شبه کد و در انواع زبان های برنامه نویسی بیان کرد. |
یک برنامه همیشه توسط کامپیوتر اجرا میشود. | الگوریتم میتواند توسط هر فردی طراحی و اجرا شود. |
نمونه الگوریتم جمع دو عدد :
Step 1: Start
Step 2: Declare variables num1, num2 and sum.
Step 3: Read values num1 and num2.
Step 4: Add num1 and num2 and assign the result to sum. sum←num1+num2
Step 5: Display sum
Step 6: Stop
نمونه کد پایتون جمع دو عدد:
This program adds two numbers/
num1 = 1.5
num2 = 6.3
# Add two numbers
sum = num1 + num2
# Display the sum
print('The sum of {0} and {1} is {2}'.format(num1, num2, sum))
انواع الگوریتم ها برای حل مسائل - انواع روش های حل مسائل
الگوریتمها دارای انواع مختلفی هستند اما اصلیترین بهشرح زیر است.
الگوریتم Brute Force
سادهترین الگوریتم ممکن که برای حل یک مسئله میتوان ابداع کرد را الگوریتم brute force مینامند. این الگوریتم برای حل یک مسئله بر قدرت محاسباتی محض تکیه کرده و هر امکانی را به جای تکنیکهای پیشرفته برای بهبود کارایی امتحان می کند. این الگوریتم در مرحله اول، یک راهحل برای مسئله ارائه کرده و در مراحل بعدی تلاش میکند در کوتاهترین زمان ممکن، خود را به یک هدف نهایی مشخص و بهینه برساند. هر مسئلهای را میتوان با رویکرد brute force حل کرد، اگرچه معمولاً پیچیدگی مکانی و زمانی آن قابل توجیه نیست.
الگوریتم حریصانه (Greedy)
در این الگوریتم رسیدن به هدف در هر گام مستقل از گام قبلی و بعدی است. یعنی در هر مرحله برای رسیدن به هدف نهایی، مستقل از این که در مراحل قبلی چه انتخابهایی صورت گرفته و انتخاب فعلی ممکن است چه انتخابهایی در پی داشته باشد، پاسخی که در ظاهر بهترین است را انتخاب میکند. به همین دلیل به این روش، روش حریصانه گفته میشود.
در حالت کلی این روش سرعت و مرتبه زمانی بهتری نسبت به روشهای مشابه خود دارد؛ اما متناسب با مسئله ممکن است به یک جواب بهینهٔ سراسری ختم نشود. این روش اغلب در حل مسائل بهینهسازی استفاده شده و در پارهای مواقع جایگزین مناسبی برای روشهایی مانند برنامهریزی پویا است.
برنامه های کاربردی :
- مرتب سازی : مرتب سازی انتخابی، مرتب سازی توپولوژیکی
- الگوریتم های پریم و کروسکال
- مسئله تغییر سکه
- مسئله کوله پشتی
- الگوریتم زمانبندی کار
الگوریتم بازگشتی (Recursive)
یکی از سادهترین نوع الگوریتم هاست زیرا نیازی به تفکر در مورد هر زیرمسئله نیست. این بدان معنی است که ما اگر به حل سادهترین زیرمسئله موجود فکر کنیم و راه حلی برای آن بیابیم بقیه مسئله را میتوان به صورت بازگشتی طراحی و پیادهسازی کرد. هر تابع بازگشتی شامل سه بخش است : بخش اول حالت پایه است که در آن دیگر صدا زدن تابع به صورت بازگشتی رخ نمیدهد و مقدار تابع در این حالت را از ابتدا میدانیم.
بخش دوم شامل پیاده سازی اعمالی است که به کمک آن ها مسئله کوچکتر شده و تابع را با مقادیر جدید صدا میزنیم و بخش سوم بخشی است که در آن، خود تابع را با مقادیر جدید صدا میزنیم. خاصیت بازگشتی یک ابزار بسیار قدرتمند برای حل مسائل به شمار میرود اما بزرگترین و مهمترین عیب این دسته از الگوریتم ها ایجاد سربار اضافه از نظر حافظه و زمان است که بهدلیل فراخوانی تابع به تعداد دفعات زیاد ایجاد میگردد. در نتیجه مدیریت حافظه یکی از اصلیترین وظایف برنامهنویس در هنگام استفاده از این الگوریتمهاست.
الگوریتم عقبگرد (Backtracking)
الگوریتم عقبگرد یک الگوریتم حل مسئله است که از رویکرد Brute Force برای یافتن خروجی مورد نظر استفاده میکند. اصطلاح عقبگرد نشان میدهد که اگر راه حل فعلی مناسب نیست، پس به عقب بروید و راه حلهای دیگر را امتحان کنید. بنابراین در عین حال یک رویکرد بازگشتی نیز هست و برای حل مسائلی استفاده میشود که راهحلهای متعددی دارند.
برنامه های کاربردی آن به شرح زیر است :
- تولید تمام رشته های باینری
- مسئله وزیر (N-Queens)
- مسئله کوله پشتی
- مسئله رنگ آمیزی نقشه
الگوریتم شاخه و کران (branch & bound)
روش حل مسئله شاخه و کران، یک الگوریتم کاربردی در مسائل بهینهسازی ترکیباتی محسوب میشود. مسائل بهینهسازی معمولا دارای پیچیدگیهای زمانی در حدود نمایی هستند (a^n, a>1) و ممکن است در بدترین حالت نیاز به بررسی تمام جایگشتهای مسئله داشته باشند.
اصولا مسائلی که فقط در زمان نمایی قابل حل هستند، مسائلی مهارنشدنی محسوب میشوند و درصورتی که اندازه مسئله بزرگ باشد، ممکن است با پردازندههای امروزی، قرنها زمان ببرد تا آن مسئله حل شود. مسائلی مانند کوله پشتی 0 و 1، فروشنده دوره گرد، مسئله SAT، پیداکردن سیکل همیلتونی در یک گراف و ... از این دسته مسائل هستند.
حال در الگوریتم شاخه و کران، سعی براین است که حالات اضافی بررسی نشود و به نحوی بعضی از جایگشتهای مسئله بررسی نشوند و هرس شوند. در این الگوریتم از روش backtracking برای بهینهسازی استفاده میشود و بعضی از شاخههای درخت که درحالت بدی هستند، بررسی نمیشود. با این ترفند میتوان بسیاری از حالتهارا نادیده گرفت و مسئله را در زمان بهتری حل کرد.
الگوریتم تقسیم و غلبه (Divide and Conquer)
این روش یکی از پرکاربردترین الگوریتم ها در برنامهنویسی است. این الگوریتم مسائل را به زیرمسائل تقسیم میکند و سپس هر یک از آنها را حل کرده و سپس با یکدیگر ترکیب و حل مسئله داده شده را بیان میکند. بنابراین الگوریتم تقسیم و غلبه دارای سه مرحله مجزا و بازگشتی است.
- تقسیم کردن : مسئله را به چند زیرمسئله کوچک که دارای شباهت یکسانی هستند تقسیم کن.
- غلبه : زیرمسئلهها اگر به اندازه کافی کوچک و غیرقابل تقسیم هستند را به صورت بازگشتی حل کن.
- ترکیب: راه حل هر زیرمسئله را باهم ترکیب کن تا پاسخ مسئله اصلی پیدا شود.
این الگوریتم به طور گسترده در مسائل مختلف مورد استفاده قرار میگیرد زیرا برای بسیاری از آنها کاملاً پایدار و بهینه است.
برنامه های کاربردی آن به شرح زیر است
- جستجوی باینری
- مرتب سازی ادغامی و سریع
- پیدا کردن میانه
- ضرب ماتریس
الگوریتم برنامه نویسی پویا (Dynamic)
رویکرد الگوریتم پویا مشابه الگوریتم تقسیم و غلبه در شکستن مسئله به زیرمسئلههای کوچکتر است. اما بر خلاف الگوریتم تقسیم و غلبه، این زیرمسائل به طور مستقل حل نمیشوند و در عوض، نتایج این زیرمسائل کوچکتر را به خاطر سپرده و برای زیرمسئلههای مشابه (آنهایی که باهم همپوشانی دارند) استفاده میکند. الگوریتم پویا در حل مسائلی کاربرد دارد که قابل تقسیم به زیرمسئلههای مشابه هستند، تا اینکه بتوان نتایج آنها را مجدد مورد استفاده قرار داد. بیشتر از این الگوریتم ها برای مسائل بهینهسازی استفاده میشود.
برنامه های کاربردی آن به شرح زیر است :
- یافتن طولانی ترین زیر رشته مشترک، طولانی ترین زیر رشته افزایشی، طولانی ترین زیر رشته مشترک و غیره.
- الگوریتم بلمن-فورد (Bellman-Ford)
- ضرب ماتریس زنجیره ای
- جمع زیر مجموعه
- مسئله کوله پشتی و بسیاری موارد دیگر.
شکل زیر انواع الگوریتم ها را نشان میدهد.
الگوریتم نویسی
برای نوشتن یک الگوریتم راه های زیادی وجود دارد. الگوریتمها میتوانند دارای ساختار و کاربردهای متفاوتی باشند مثلاً یک الگوریتم میتواند خیلی ساده و یا پیچیده و پر از محاسبات ریاضی باشد و یا اینکه برای یک نمایش گرافیکی بکار رود. اما به طور کلی نکته مهم در نوشتن الگوریتم این است که الگوریتم کارآمد بوده و روش و منطق خوبی برای بررسی و حل مسئله ارائه دهد و در نظر گرفتن فرم الگوریتم اهمیت خاصی ندارد.
فرآیند توسعه الگوریتم (یک طرح) یک گام کلیدی در حل مسئله است و پنج مرحله اصلی دارد.
- تعریف مسئله
این مرحله بسیار دشوارتر از آن چیزی است که به نظر می رسد. در این مرحله مشتری و یا کاربر به دنبال راه حلی برای یک مسئله و یا مشکل است و الگوریتم نویس باید مسئله را به خوبی درک کرده و راهی برای حل مشکل پیدا و الگوریتمی بنویسد که مسئله را حل نماید. بخشی از مسئولیت الگوریتم نویس شناسایی عیوب در شرح مسئله و همکاری با مشتری برای رفع آن نقص است.
- تجزیه و تحلیل مسئله
هدف از این مرحله تعیین دو نقطه شروع و پایان برای حل مسئله است. این فرآیند شبیه به ریاضیدانی است که تعیین می کند چه دادهای دارد و چه چیزی را باید اثبات کند. یک تجزیه و تحلیل خوب و کارآمد انجام این مرحله را آسان تر می کند.
الگوریتم نویس در هنگام تعیین نقطه شروع الگوریتم، با چنین سوالاتی روبروست:
- چه داده هایی در دسترس است؟
- چه قوانینی برای کار با داده ها وجود دارد؟
- چه روابطی بین مقادیر داده وجود دارد؟
در هنگام تعیین نقطه پایان الگوریتم نیز باید ویژگی های راه حل را توصیف کند. یا به عبارت دیگر، الگوریتم نویس چگونه متوجه میشود که کارش تمام شده؟ پرسیدن سوالات زیر اغلب به تعیین نقطه پایان کمک می کند.
- چه حقایق جدیدی خواهیم داشت؟
- چه مواردی تغییر خواهد کرد؟
- چه مشکلاتی دیگر وجود نخواهند داشت؟
- یک الگوریتم سطح بالا ایجاد کنید
الگوریتم طرحی برای حل یک مسئله است، اما طرح ها در سطوح مختلفی از جزئیات ارائه می شوند. معمولاً بهتر است با الگوریتمی شروع بکار کنید که بخش اصلی راه حل را شامل میشود و اضافه کردن جزئیات را به زمانهای بعدی واگذار کنید. به این الگوریتم اصطلاحاً الگوریتم سطح بالا میگویند.
- با افزودن جزئیات بیشتر، الگوریتم را اصلاح کنید
بعد از نوشتن الگوریتم سطح بالا نوبت به اضافه کردن جزئیات میرسد، اما چقدر جزئیات را باید اضافه کنیم؟ متأسفانه پاسخ به این سوال بستگی به شرایط دارد. ما باید در نظر بگیریم که چه کسی (یا چه چیزی) قرار است الگوریتم را پیادهسازی کند و آن شخص (یا چیز) به چه میزان در انجام کار مهارت دارد. مورد دیگر آنکه آن دسته از الگوریتمهایی که برای برنامههای کامپیوتری طراحی میشوند، باید قابلیتهای کامپیوتر را نیز در نظر بگیرند و حتی جزئیات کافی را نیز ارائه کند.
- الگوریتم را مرور کنید
مرحله آخر بررسی الگوریتم است. باید گام به گام الگوریتم را بررسی کرده و مشخص کنیم که آیا این الگوریتم مشکل اصلی را حل میکند یا خیر. و هنگامی که مطمئن شدیم الگوریتم راه حل مسئله را ارائه می دهد، شروع به جستجوی جزئیات دیگری کنیم. سوالات زیر نمونه سوالاتی هستند که در زمان بررسی الگوریتم باید پرسیده شوند:
- آیا این الگوریتم یک مسئله بسیار خاص را حل میکند یا برای مسائل کلی تر نیز کارآمد است؟
- اگر برای مسئله خاصی طراحی شده، آیا باید آن را تعمیم داد؟
- آیا می توان این الگوریتم را ساده کرد؟
- آیا این راه حل مشابه راه حل مسئله دیگری است؟ در چه مواردی شبیه هم هستند؟ چه تفاوتهایی دارند؟
کاربرد الگوریتم
هنگامی که کلمه الگوریتم را میشنویم، تصاویری از استارتاپهای فناوری و کدهای باینری برایمان تداعی میشود اما در واقعیت الگوریتم ها ساده تر از آن چیزی هستند که ما تصور میکنیم. به طور یقین امروزه جادوگران فناوری جهان از آنها برای ساخت نرمافزارها بهره میگیرند، اما در زندگی روزمره نیز بسیار پرمصرف هستند. در فیلم زیر به برخی از کاربردهای الگوریتم که در زندگی روزمره استفاده میشود اشاره کردهایم.
از سنین پایین با روشی گام به گام به ما آموزش داده میشود که چگونه کارهای روزمرهمان را انجام دهیم مانند اینکه چگونه بشماریم، اشیاء را مرتب کنیم، راه برویم، بند کفشهایمان را ببندیم و در تمامی این کارها اساساً ما در حال یادگیری تفکر الگوریتمی هستیم. در فیلم بالا چندین کاربر الگوریتم را بیان کردیم، حال در ادامه به معرفی و بررسی چند کاربرد دیگر الگوریتم در زندگی روزمره میپردازیم.
مرتب کردن برگهها
معلمی را تصور کنید که برگههای امتحانی دانشآموزانش را بر اساس ترتیب حروف الفبای نام کوچک آنها مرتب میکند. این کار شبیه عملکرد یک الگوریتم مرتبسازی است و تنها با نگاه کردن به حرف اول نام آنها، میتواند بسیاری از اطلاعات غیرضروری را حذف کند. این یک فرآیند خودکار است که مرتبسازی را کارآمدتر میکند.
تشخیص چهره
هر روز و هرلحظه، زمانیکه چهره یکی از عزیزان، همکار و یا حتی یک همسایه عجیب و غریب را میبینیم، از دادههایی استفاده میکنیم که قبلاً در مورد ویژگیهای ظاهری آن شخص جمع آوری کردهایم. سپس این اطلاعات در داخل مغز تجزیه و تحلیل میشود تا به طور خودکار دیگران را شناسایی کند و این نوعی از یک فرآیند پردازش تصویرپردازش تصویر دیجیتال چیست؟ چه انواعی دارد؟ چه مراحلی را شامل میشود؟ پردازش تصویر یکی از فیلدهای پرطرفدار مرتبط با گرافیک کامپیوتر، بینایی کامپیوتر، هوش مصنوعی، یادگیری ماشین، و الگوریتمها و محاسبات است که ارتباط تنگاتنگی میان تمام آنهاست. در نتیجه در این صفحه علاوه بر معرفی این فیلد، نقشه راهی نیز برای علاقهمندان این حوزه ارائه کردهایم. طبیعی در چشم و مغز انسانهاست. الگوریتم ها میتوانند این فرآیند را برای کامپیوترها خودکار کنند اما با این حال، برنامههای تشخیص چهره گاهاً درست عمل نمیکنند و چهرههای تیره پوست را به دقت تشخیص نمیدهند. این مشکل حاکی از آن است که هنوز الگوریتمهای تشخیص چهره به اندازه کافی کامل نیستند و نیاز به پیشرفت دارند.
نتایج تکراری
دیوید چکوفسکی، معلم علوم و فناوری کامپیوتر در مدارس مرکزی هاید پارک، این مثال را توضیح میدهد. «اگر میخواهید یک وظیفه را به خوبی انجام دهید، نگاه کردن به نمونههای موفق قبلی افراد دیگر میتواند بسیار مفید باشد.» استفاده از دستورات پخت غذا در حین آشپزی نمونه خوبی برای درک این مطلب است. مطمئناً شما به تنهایی میتوانید از عهده درستکردن یک پاستای خوشمزه به طریق آزمون و خطا بربیابید، اما پیروی از دستور العمل گام به گام یک سرآشپز معروف موفقیت شما را تضمین خواهد کرد.
چراغ راهنمایی و رانندگی
اکثر چراغهای راهنمایی به طور خودکار به هر یک از سه رنگ سبز، زرد و یا قرمز تغییر حالت نمیدهند و در عوض ورودیهای حسی وجود دارند که زمانبندی سیگنالها را بر اساس جریان ترافیک تعیین میکنند. این الگوریتمها دارای یک ترتیب گام به گام و خوبی هستند و ترافیک را به درستی هدایت میکنند.
زمان بندی حرکت اتوبوسها
هر روز صبح، هزاران اتوبوس از محلهها عبور میکنند و مسافران زیادی را سوار میکنند. برنامهریزی و زمانبندی حرکت اتوبوسها و تعیین مسیر آنها و پیشبینی زمان دقیق رسیدنشان به ایستگاهها، کاری است که بدون کمک الگوریتم ها امکانپذیر نخواهد بود. این مسئله مسیریابی به طور کلاسیک به عنوان "مسئله فروشنده دورهگرد" شناخته میشود و حتی به عنوان تمرینی برای علوم تئوری کامپیوتر در نظر گرفته شده است.
الگوریتمها در زندگی روزمره به ما بسیار نزدیک و پرکاربرد هستند ولی آنها را با عنوان الگوریتم نمیشناسیم. از آشپزی گرفته تا جستجوی مسیرها و انجام کارهای ساده مانند بستن بند کفشهایتان از نمونههای الگوریتم ها هستند و آنقدرها هم که به نظر میآیند دشوار و سخت نیستند.
کاربرد الگوریتم در اینترنت
اینترنت برای داشتن عملکردی صحیح به الگوریتم های بسیار زیادی متکی است. هنگامی که یک عبارت را در موتور جستجو گوگل تایپ میکنید، گوگل از یک الگوریتم بسیار پیچیده پیروی کرده تا نتایج را به شما نشان دهد. یا وقتی کالای مورد نظرتان را از طریق سایتهای اینترنتی خریداری میکنید، از یک الگوریتم برای انتقال ایمن اطلاعات کارت اعتباری شما استفاده میشود. حتی یک حرکت ساده در اینترنت و یا بارگذاری یک صفحه وب، نیاز به استفاده از یک الگوریتم دارد. در این بخش از کاربرد چند الگوریتم در کارکرد اینترنت نام برده شده است.
موتور جستجو Google
حتی یک عمل به ظاهر ساده مانند جستجو در گوگل بدون کمک الگوریتمها امکانپذیر نیست. الگوریتمهای گوگل طوری طراحی شدهاند که به تایپ کامل کلمات سوال شما نیازی ندارند و در کسری از ثانیه بدون آنکه جمله کاملی را از جانب شما دریافت کنند، نتایج مورد انتظارتان را نشان میدهند. مثلاً اگر سوال مدنظر شما این باشد که «آیا یک فیل شنا میکند؟» اما کلمات "فیل شنا" را جستجو کنید فوراً، خروجی یا نتایج، فیلمهایی از شنای فیلها خواهد بود و حتی به دنبال آن موارد بیشتری را ارائه میدهد.
مسیریابی در شبکه
لایه شبکه برای انتقال بستهها از مبدأ به مقصد، باید بهترین مسیر ممکن برای انتقال دادهها را تعیین و هدایت کند. پس وظیفه اصلی لایه شبکه ارائه بهترین مسیر است که به این منظور از الگوریتمهای مسیریابی بهره برده و به هدایت ترافیک اینترنت به طور موثر کمک میکند. در لایه شبکه بهترین مسیر، مسیری است که از مبدا تا مقصد دارای «مسیر کم هزینه» باشد.
بدون الگوریتم های مسیریابی، اینترنت معنایی ندارد والگوریتم مسیریابی یکی از فناوریهای اصلی در قلب اینترنت است.
الگوریتم های مسیریابی مانند فازی، اکتشافی و تطبیقی از مشهورترین الگوریتم ها هستند که هرکدام به ایجاد ارتباطات موثر در شبکه کمک میکنند.
رمزنگاری
با رشد و گسترش همهجانبه اینترنت در زندگی افراد و فعالیتهای روزمره و شغلیشان، حفظ و امنیت اطلاعات به یک مسئله مهم و ضروری در دنیای فناوری تبدیل شد. بنابراین عدم دسترسی افراد به اطلاعات شخصی و محرمانه یکدیگر از مهمترین چالشهای امنیتی در خصوص توزیع و مبادله اطلاعات در دنیای اینترنت به حساب میآید. به همین منظور راهحل های متفاوتی برای برقراری امنیت شبکه و حفاظت اطلاعات ارائه شد که رمزنگاری دادهها یکی از متداول ترین آنهاست.
در تکنیک رمزنگاری، اطلاعات توسط الگوریتمهای پیشرفتهای به صورت بهم ریخته و غیرقابل خواندن تبدیل میشوند؛ به گونهای که به غیر از مخاطب مورد نظر، برای هیچ فردی قابل فهم نباشد. هر الگوریتم رمزنگاری باید دارای سه ویژگی مهم امنیت (داده ارسالی نباید به دست فرد غیرمجاز برسد)، هویت (مشخصات افراد مجاز به درستی تشخیص داده شود) و غیرجعلی بودن اطلاعات باشد.
خدمات مالی، اولین خدماتی بودند که استفاده از شبکههای کامپیوتری در آنها مرسوم شد و موضوع حفاظت اطلاعات و امنیت شبکه خیلی زود در اولویت توسعهدهندگان شبکههای کامپیوتری قرار گرفت.شاید سادهترین مثال برای درک بهتر مطلب، انجام تراکنشهای اینترنتی بانکی است که در آن الگوریتمهای رمزنگاری وظیفه مخفی نگهداشتن اطلاعات کارت و حساب بانکی کاربر از دید سایرین و ایجاد امنیت لازم برای تبادل پول در فضای اینترنت را دارند.
کاربرد الگوریتم در ریاضی
الگوریتم در ریاضی، مجموعه ای از مراحل است که برای حل محاسبات ریاضی استفاده میشود. بطور کلی هدف از الگوریتم های ریاضی افزایش دقت در حل مسئله هاست. استفاده مکرر از یک الگوریتم میتواند احتمال اشتباه بودن پاسخ را کاهش داده و در هر تکرار، الگوریتم پاسخها را در حافظه نگه داشته و در تکرار بعدی سعی میکند مسائل را دقیقتر حل کند.
امروزه الگوریتمهای مشهور و پیشرفته زیادی وجود دارند که بر پایه محاسبات معادلات ریاضی پایهگذاری شدهاند. الگوریتم دایجسترا یکی از معروفترین الگوریتمهای مسیریابی در جهان به حساب میآید که از قواعد و اصول ریاضی به منظور یافتن کوتاهترین مسیر استفاده میکند. نقشه گوگل (Google Map) از این الگوریتم برای ارائه مسیری کوتاه و کم هزینه به کاربران خود بهره میگیرد.
امروزه نقش الگوریتمها در ریاضیات و طراحی برنامههای کاربردی بیش از هر زمان دیگری مهم و موثر است و مثالهای زیادی از این الگوریتمها را در زندگی روزمره میتوان یافت. برای مطالعه در خصوص مهمترین الگوریتمهای ریاضی و کاربردهای آنها میتوانید به صفحه کاربرد ریاضیات گسسته در زندگی روزمره مراجعه کنید.
نمونه دیگری از استفاده الگوریتم
یادگیری ماشین شاخه ای از دانش هوش مصنوعی است که نمونه خوبی از الگوریتمها به شمار میآید. علم یادگیری ماشین از الگوریتم های متعددی برای یادگیری و کار بر روی دادهها استفاده میکند تا بتواند نتایج دقیقی را پیش بینی کند.
علم یادگیری ماشین به دو روش یادگیری باناظر (Supervised) و یادگیری بدون ناظر (Unsupervised) دسته بندی میشود.
الگوریتم های یادگیری ماشین با ناظر (Supervised) از روی بخشی از دادهها که به دادههای آموزشی (Train) معروفند، شروع به یادگیری میکنند. داده های آموزشی (Train) به ورودیهایی گفته میشود که دارای برچسب خروجی صحیح هستند. الگوریتم ناظر در حین آموزش، ارتباط میان دادههای آموزشی و برچسب های خروجی مرتبط با هر یک را یافته و به این ترتیب الگوی رفتاری میان آنها را یاد میگیرد.
پس از آموزش، الگوریتم یادگیری Supervised ورودیهای جدید (Test) که برچسب خروجی آنها مشخص نیست را گرفته و مطابق با الگویی که براساس داده های آموزشی بدست آورده، برچسب خروجی هر داده را پیش بینی و طبقه بندی میکند.
یادگیری ماشین بدون ناظر (Unsupervised) شامل الگوریتم هایی است که روی دادههای بدون برچسب آموزش میبیند. این الگوریتم ها دادههای بدون برچسب را تجزیه و تحلیل میکند و از روی این دادهها الگوهایی را پیدا میکند که مطابق با آنها دادهها را به زیرمجموعههای متفاوتی گروه بندی یا در اصطلاح یادگیری ماشین خوشه بندی میکند. الگوریتم های یادگیری عمیق (Deep Learning) از جمله شبکه های عصبی جزو الگوریتمهای بدون ناظر به شمار میروند.
مشاغل مرتبط با الگوریتم
مهمترین بخش از هر شاخهای، مشاغل موجود درآن است. خوشبختانه رشته الگوریتم از رشتههای بسیار عالی محسوب میشود که بازارهای مرتبطی باآن یافت میشود که به شرح زیر هستند :
- مهندس الگوریتم با درآمدی حدود 121.500 دلار
- توسعه دهنده نرمافزار با درآمدی حدود 227.400 الی 168.100 دلار در سال
- مهندس علوم داده با درآمدی حدود 899 دلار در سال
- مهندس داده و هوش مصنوعی با درآمدی حدود 112 دلار در سال
- مهندس بیوانفورماتیک با درآمدی حدود 104.575 دلار در سال
- مهندس ارشد طراحی IC با درآمدی حدود 106.821 دلار در سال
- مهندس شبکه با درآمدی حدود 90.149 دلار در سال
- مهندس پردازش تصویر و بینایی ماشین با درآمدی حدود 122.464 دلار در سال
برای اطلاع از جزئیات مشاغل گفته شده میتوانید به صفحه مشاغل کامپیوتر در سایت کنکور کامپیوتر مراجعه فرمائید.
تاریخچه الگوریتم
در آخر شاید جالب باشد بدانید که کلمه الگوریتم از نام محمدبن موسی الخوارزمی ریاضیدان ایرانی قرن نهم (780- 850 هجری قمری) گرفته شده است که برگردان آن به زبان لاتین به واژه الگوریتم تغییر یافته است. محمد بن موسی خوارزمی ریاضیدان، منجم، جغرافیدان و دانشمند بیت الحکمه در بغداد بود که نامش به معنای «بومی خوارزم» است، منطقهای که بخشی از ایران بزرگ بوده و اکنون در ازبکستان است.
ویدیوی زیر در خصوص تاریخچه الگوریتم است که میتوانید آن را تماشا کنید و از آن لذت ببرید.
مثالهای ساده الگوریتمی
مثال 1: الگوریتمی و فلوچارتی که دو زاویه را دریافت میکند و بررسی کند که آیا آن دو زاویه متمم هستند یا خیر
مثال 2: الگوریتمی و فلوچارتی که سن افراد را دریافت کند و بررسی کند که آیا آن فرد واجد شرایط هست یا خیر
مثال 3: الگوریتمی و فلوچارتی که هزینه تولید یک دست لباس را دریافت کند و حداقل تعداد لباسی که باید در هفته تولید شود تا به سود 560 هزار تومنی در هفته برسد را بدست آورد
4.Find the largest number among three numbers
Step 1: Start
Step 2: Declare variables a, b and c.
Step 3: Read variables a, b and c.
Step 4: If a > b
If a > c
Display a is the largest number.
Else
Display c is the largest number.
Else
If b > c
Display b is the largest number.
Else
Display c is the greatest number.
Step 5: Stop
5. Find Roots of a Quadratic Equation ax2 + bx + c = 0
Step 1: Start
Step 2: Declare variables a, b, c, D, x1, x2, rp and ip;
Step 3: Calculate discriminant
D ← b2-4ac
Step 4: If D ≥ 0
r1 ← (-b+√D)/2a
r2 ← (-b-√D)/2a
Display r1 and r2 as roots.
Else
Calculate real part and imaginary part
rp ← -b/2a
ip ← √(-D)/2a
Display rp+j(ip) and rp-j(ip) as roots
Step 5: Stop
6. Find the factorial of a number
Step 1: Start
Step 2: Declare variables n, factorial and i.
Step 3: Initialize variables
factorial ← 1
i ← 1
Step 4: Read value of n
Step 5: Repeat the steps until i = n
5.1: factorial ← factorial*i
5.2: i ← i+1
Step 6: Display factorial
Step 7: Stop
7. Check whether a number is prime or not
Step 1: Start
Step 2: Declare variables n, i, flag.
Step 3: Initialize variables
flag ← 1
i ← 2
Step 4: Read n from the user.
Step 5: Repeat the steps until i=(n/2)
5.1 If remainder of n÷i equals 0
flag ← 0
Go to step 6
5.2 i ← i+1
Step 6: If flag = 0
Display n is not prime
else
Display n is prime
Step 7: Stop
جمع بندی:
امیدواریم که با نوشتن این مقاله توانسته باشیم، شما را با اهمیت و ضرورت علم الگوریتم در کامپیوتر به خوبی آشنا کنیم؛ چرا که یکی از عوامل موفقیت در یادگیری علم برنامهنویسی، درک کامل الگوریتم و نحوه بکارگیری آنها در پروژههایی است که به شما واگذار میشود. درس طراحی الگوریتم نه تنها در ایران بلکه در تمام دانشگاههای دنیا یکی از مهمترین و زیربناییترین دروس کامپیوتر است که شما برای تبدیل شدن به یک مهندس کامپیوتر برتر به آن نیاز دارید، شما عزیزان میتوانید برای آشنایی بیشتر با درس طراحی الگوریتمآموزش طراحی الگوریتم به زبان سادهدرس طراحی الگوریتم یکی از مهمترین و بنیادیترین دروس رشته کامپیوتر است. هدف از این درس، معرفی روشهای مختلف طراحی الگوریتمها برای حل مسائل گوناگون است، در این صفحه به معرفی و آموزش طراحی الگوریتم پرداخته شده است. به صفحه مذکور مراجعه کنید. درست است که تحصیلات آکادمیک بخش کوچکی از تجربیات و یادگیری شما را دربرمیگیرد اما دروسی مانند الگوریتم در ایجاد یک زیرساخت دانشی بسیار قوی، نقش مفید و موثری دارند.
یادگیری کامل الگوریتم چقدر زمان میبرد؟
بطور کلی الگوریتم بعنوان یکی از سختترین موضوعات برای یادگیری در علوم کامپیوتر در نظر گرفته میشود و یادگیری آن برای هر برنامه نویسی ضروری است. قصد نداریم شما را بترسانیم، اما باید بدانید که تسلط بر این موضوع به زمان و تلاش زیادی نیاز دارد. اما برای همه دانشجویان این سوال مطرح است که برای یادگیری کامل الگوریتم چقدر زمان باید صرف کنند؟ پاسخ سوال این است که اگر شما در طول روز، حدود 3 تا 4 ساعت را صرف یادگیری و درک مطالب الگوریتم کنید، معمولاً حدود 6 تا 8 هفته طول میکشد تا آن را به طور کامل یاد بگیرید. با این حال، هیچ جدول زمانی مشخصی برای مدت زمان یادگیری الگوریتم وجود ندارد و همه چیز به اراده و سرعت شما در مطالعه و درک عمیق مطالب بستگی دارد.
ویژگیهای الگوریتم در برنامهنویسی چیست؟
همانطور که هر غذایی دستورالعمل پخت مخصوص به خود را دارد، برای ایجاد الگوریتم در برنامهنویسی نیز از یک الگوریتم برای همه برنامهها استفاده نمیشود. اما تمام الگوریتمها، اصول یکسان و استانداردی را برای ایجاد دستورالعملها بکار میگیرند.
چرا الگوریتمها برای بچهها مهم هستند؟
درک فرآیند ساخت یک الگوریتم به بچهها کمک میکند تا پایهای قوی در تفکر منطقی و حل مسئله داشته باشند. تفکر الگوریتمی در کودکان موجب توسعه مهارتهای بین رشتهای برای ایجاد راهحلهای خلاقانه و بدیع در خصوص طیف گستردهای از مشکلات حوزه علوم ریاضیات و کامپیوتر و حتی فراتر از آن خواهد شد.
منظور از تجزیه و تحلیل الگوریتم چیست؟
تحلیل الگوریتمی بخش مهمی از نظریه پیچیدگی محاسباتی است که در آن منابع مورد نیاز الگوریتم برای حل یک مسئله محاسباتی را تخمین میزنند و هرچقدر میزان مصرف منابع معقولانه و کمتر باشد، آن الگوریتم بهتر و کارآمدتر خواهد بود. هنگامی که صحبت از تحلیل الگوریتمها در میان میآید، چهار موضوع اهمیت ویژهای پیدا میکنند : زمان، حافظه، مصرف داده و مصرف انرژی