المعلوماتية. أساسيات الخوارزمية والبرمجة

يعتبر مفهوم الخوارزمية أساسيًا لعلوم الكمبيوتر مثل مفهوم المعلومات. هناك العديد من التعريفات المختلفة للخوارزمية ، لأن هذا المفهوم واسع جدًا ويستخدم في مختلف مجالات العلوم والتكنولوجيا والحياة اليومية.

الخوارزمية عبارة عن سلسلة مفهومة ودقيقة من الإجراءات التي تصف عملية تحويل كائن من حالة أولية إلى حالة نهائية.

المؤدييمكن أن تكون الخوارزمية إما شخصًا (وصفات ، أو تعليمات مختلفة ، أو خوارزميات للحسابات الرياضية) أو جهازًا تقنيًا. آلات مختلفة (أجهزة كمبيوتر ، روبوتات صناعية ، أجهزة منزلية حديثة) فناني الأداء الرسميينالخوارزميات. لا يُطلب من المنفذ الرسمي فهم جوهر المشكلة التي يتم حلها ، ولكن التنفيذ الدقيق لتسلسل الأوامر مطلوب.

يمكن كتابة الخوارزمية بطرق مختلفة (وصف لفظي ، وصف رسومي - مخطط كتلة ، برنامج بإحدى لغات البرمجة ، إلخ). البرنامج عبارة عن خوارزمية مكتوبة بلغة.

لإنشاء خوارزمية (برنامج) ، عليك أن تعرف:

    مجموعة كاملة من البيانات الأولية للمشكلة (الحالة الأولية للكائن) ؛

    الغرض من إنشاء الخوارزمية (الحالة النهائية للكائن) ؛

    نظام أوامر المنفذ (أي مجموعة أوامر يفهمها المنفذ ويمكن أن ينفذها).

يجب أن تحتوي الخوارزمية (البرنامج) الناتجة على مجموعة الخصائص التالية:

    التكتم (الخوارزمية مقسمة إلى خطوات منفصلة - أوامر) ؛

    لا لبس فيه (كل أمر يحدد الإجراء الوحيد الممكن للقائم بالأداء) ؛

    الوضوح (يتم تضمين جميع أوامر الخوارزمية في نظام أوامر المنفذ) ؛

    نجاعة (يجب على المؤدي حل المشكلة في عدد محدود من الخطوات).

تمتلك معظم الخوارزميات أيضًا خاصية شخصية جماعية (باستخدام نفس الخوارزمية ، يمكن حل العديد من المشكلات المماثلة).

لقد لوحظ أعلاه أنه يمكن كتابة نفس الخوارزمية بطرق مختلفة. يمكن كتابة الخوارزمية لغة طبيعية.على هذا النحو ، نستخدم الوصفات والتعليمات وما إلى ذلك. لتسجيل الخوارزميات المخصصة لفناني الأداء الرسميين ، خاصة لغات البرمجة... يمكن وصف أي خوارزمية بيانيا في شكل مخطط كتلة... لهذا ، تم تطوير نظام تدوين خاص:

تعيين وصف ملاحظاتتصحيح
بداية الخوارزمية ونهايتها
إدخال البيانات والمخرجات. يُشار أحيانًا إلى إخراج البيانات بشكل مختلف:

عمل في الخوارزميات الحسابية ، هذه هي المهمة
شوكة شوكة - مكون مطلوب لتنفيذ الفروع والحلقات
تبدأ الدورة بالمعلمة
عملية نموذجية في البرمجة أو الإجراءات أو الإجراءات الفرعية
انتقالات بين الكتل

دعونا نعطي مثالاً لوصف خوارزمية لتجميع كميتين في شكل مخطط كتلة:

هذه الطريقة في وصف الخوارزمية هي الأكثر رسومية ومفهومة للبشر. لذلك ، عادةً ما يتم تطوير خوارزميات المنفذين الرسميين أولاً في شكل مخطط كتلة ، وبعد ذلك فقط يقومون بإنشاء برنامج على أحدهم.

المبرمج لديه القدرة على تصميم واستخدام الهياكل الحسابية غير النمطية ، ومع ذلك ، هذا ليس ضروريًا. يمكن تطوير أي خوارزمية معقدة بشكل تعسفي على أساس ثلاثة هياكل نموذجية: التعاقب والتفرع والتكرار. في هذه الحالة ، يمكن ترتيب الهياكل بالتتابع واحدة تلو الأخرى أو متداخلة مع بعضها البعض.

الهيكل الخطي (تابع).

أبسط هيكل خوارزمي هو خطي. في ذلك ، يتم تنفيذ جميع العمليات مرة واحدة بالترتيب الذي تم كتابتها به.

المتفرعة.

الخامس المتفرعة الكاملةهناك خياران لأفعال المنفذ ، اعتمادًا على قيمة التعبير المنطقي (الشرط). إذا كان الشرط صحيحًا ، فسيتم تنفيذ الفرع الأول فقط ، وإلا فسيتم تنفيذ الفرع الثاني فقط.

يمكن أن يكون الفرع الثاني فارغًا. هذا الهيكل يسمى المتفرعة أو الاجتياز غير مكتمل.

من الممكن بناء الهيكل من عدة فروع " خيار"(تفرعات متعددة) ، والتي لن تختار من بين اثنين ، ولكن من أكثرخيارات لأعمال المقاول ، حسب عدة شروط... من الضروري أن يتم تنفيذ فرع واحد فقط - في مثل هذا الهيكل ، يصبح ترتيب الشروط مهمًا: إذا تم استيفاء عدة شروط ، فعندئذٍ سيعمل واحد منهم فقط - الأول من أعلاه.


دورة (التكرار).

دورةيسمح لك بتنظيم التكرارات المتعددة لنفس تسلسل الأوامر- يطلق عليه جسم الدورة. في أنواع مختلفة من خوارزميات التكرار ، يمكن أن يعتمد عدد التكرارات على قيمة التعبير المنطقي (الشرط) أو يمكن ترميزها في الهيكل نفسه. هناك دورات: " د ا», « ص عين», دورات مع عداد.في الحلقات "do" و "p oka" يمكن للتعبير المنطقي (الشرط) أن يسبق جسم الحلقة ( حلقة الشرط المسبق) أو إنهاء الحلقة ( حلقة ما بعد الشرط).

C ikly« د ا"- تكرار دورة الجسم حتى يتم استيفاء الشرط:

C ikly « ص عين"- تكرار دورة الجسم أثناء الحالةإجراء (صحيح):

ج ikli مع عداد (مع المعلمة)- تكرار جسم الحلقة بعدد معين من المرات:

الخوارزمية المساعدة (روتين فرعي ، إجراء).

خوارزمية المساعد هي وحدة يمكن الوصول إليها عدة مرات من الخوارزمية الرئيسية.يمكن أن يؤدي استخدام الخوارزميات المساعدة إلى تقليل حجم الخوارزمية بشكل كبير وتبسيط تطويرها.

طرق تطوير الخوارزميات المعقدة.

هناك طريقتان لتطوير الخوارزميات المعقدة:

طريقة تفصيل المهام المتسلسلة("من أعلى إلى أسفل") هو أن المشكلة المعقدة الأصلية مقسمة إلى مهام فرعية. يتم النظر في كل مشكلة فرعية وحلها بشكل منفصل. إذا كانت أي من المهام الفرعية صعبة ، يتم تقسيمها أيضًا إلى مهام فرعية. تستمر العملية حتى يتم تقليل المهام الفرعية إلى المهام الأساسية. يتم بعد ذلك تجميع حلول المشكلات الفرعية الفردية في خوارزمية واحدة لحل المشكلة الأصلية. تستخدم هذه الطريقة على نطاق واسع لأنها تسمح للعديد من المبرمجين بتطوير خوارزمية عامة لحل المهام الفرعية المحلية في وقت واحد. هذا شرط أساسي للتطوير السريع لمنتجات البرمجيات.

طريقة التجميع("من أسفل إلى أعلى") هو إنشاء مجموعة من وحدات البرامج التي تنفذ حل المهام النموذجية. عند حل مشكلة معقدة ، يمكن للمبرمج استخدام الوحدات المطورة كخوارزميات مساعدة (إجراءات). لدى العديد منها بالفعل مجموعات مماثلة من الوحدات ، مما يبسط بشكل كبير ويسرع إنشاء خوارزمية معقدة.

مراقبة - تفاعل هادف مع أشياء ، بعضها تحكم ، والبعض الآخر يتم التحكم فيه.

في أبسط الحالات ، هناك نوعان من هذه الأشياء:

من وجهة نظر علوم الكمبيوتر يمكن اعتبار إجراءات التحكم بمثابة معلومات تحكم. يمكن نقل المعلومات في شكل أوامر.يسمى تسلسل الأوامر للتحكم في الكائن ، مما يؤدي إلى هدف محدد مسبقًا خوارزمية التحكم... وبالتالي ، يمكن تسمية كائن التحكم بمنفذ خوارزمية التحكم. في المثال أعلاه ، يعمل كائن التحكم "بدون النظر" إلى ما يحدث لكائن التحكم ( فتح حلقة التحكم). يسمى مخطط التحكم هذا افتح... يمكن أن يأخذ مخطط التحكم الآخر في الاعتبار معلومات حول العمليات التي تحدث في كائن التحكم:

في هذه الحالة ، يجب أن تكون خوارزمية التحكم مرنة بدرجة كافية لتحليل هذه المعلومات واتخاذ قرار بشأن إجراءاتها الإضافية اعتمادًا على حالة عنصر التحكم ( مراقبة ردود الفعل). يسمى مخطط التحكم هذا مغلق.

بمزيد من التفصيل ، يتم دراسة عمليات التحكم. علم التحكم الذاتي... يدعي هذا العلم أن عمليات الإدارة الأكثر تنوعًا في المجتمع والطبيعة والتكنولوجيا تحدث بطريقة مماثلة ، وتطيع نفس المبادئ.

غالبًا ما توجد مقالات مثل "هل يحتاج المبرمج إلى خوارزميات" ، وكلها لها نفس النموذج تقريبًا. يكتب مؤلف المقال عادةً: "لقد كنت أكتب مواقع / نصوصًا في 1C لمدة N سنوات ، ولم أستخدم أبدًا الخوارزميات أو هياكل البيانات. كما يستشهد كمثال بالأشجار ذات اللون الأحمر والأسود أو بعض الهياكل الغريبة الأخرى ، والتي لا تُرى غالبًا في المنطقة التي يعمل فيها المؤلف ، على كل حال. تتلخص هذه المقالات في حقيقة أن المبرمجين في منطقة معينة لا يستخدمون هياكل بيانات معقدة ولا يحلون مشاكل NP.

إن صياغة مثل هذا السؤال هي خاطئة من حيث الأساس. يتزايد عدد التخصصات في الصناعة باستمرار ، والشخص الذي يكتب المواقع على .net سيفعل أشياء مختلفة تمامًا عن الشخص الذي يكتب برامج تشغيل لأجهزة الاستشعار في بنية ARM في ظل نظام تشغيل غريب. دعنا أولاً نحدد ما هي الخوارزمية. بشكل غير رسمي ، يعرّف Cormen الخوارزمية كإجراء محدد جيدًا يأخذ قيمة واحدة أو أكثر كمدخلات ويعيد قيمة واحدة أو أكثر كنتيجة لذلك. بشكل رسمي ، يتم تعريف الخوارزمية في نماذج حسابية مختلفة: العمليات التي يمكن إجراؤها على آلة تورينج أو باستخدام حساب لامدا. لذا فإن أي كود يقوم بشيء ما هو خوارزمية. اتضح أن السؤال "هل يحتاج المبرمج إلى خوارزميات" يمكن ترجمته على أنه "هل يحتاج المبرمج إلى أن يكون قادرًا على كتابة التعليمات البرمجية". يجب أن يبدو السؤال الصحيح مثل: "هل يحتاج مبرمج في الصناعة X إلى معرفة الخوارزميات المتقدمة وتفاصيل نظرية الحساب".

إذا نظرت إلى كل هذه المقالات ، ستلاحظ أن الأشخاص الذين يكتبونها قد شعروا بالإهانة من قبل الجامعات لإجبارهم على تعلم الكثير من المواد المعقدة - في شكل تحليل حسابي وخوارزميات معقدة وهياكل بيانات - والتي بدت لهم لتكون بلا فائدة ... في الواقع ، إن مؤلفي المقالات مستاءون من الجامعات لأنهم لم يتمكنوا من التنبؤ بمجال العمل المستقبلي للمؤلفين ومنحهم فقط الحد الأدنى من مجموعة المهارات اللازمة. في الواقع ، من أجل كتابة مواقع ونصوص بسيطة ، لا تحتاج إلى معرفة خاصة بالخوارزميات وهياكل البيانات. أم أنها لا تزال ضرورية؟

دعونا نفكر فيما يحتاج مبرمج الجامعة إلى تدريسه من أجل اكتساب المهارات اللازمة لمهنة ناجحة. مكتبات؟ إطار أعمال؟ لقد أصبحت قديمة ، وتتغير واجهاتهم ، وكلها مكتوبة في أغلب الأحيان بلغة واحدة ، والتي قد لا يستخدمها الطلاب أبدًا في الصناعة. لتعليم الجميع لكتابة المواقع؟ أو تعليم الجميع كتابة نظام تشغيل؟ يجب أن يصل التعليم إلى أكبر عدد ممكن من الجمهور وأن يوفر أكبر مجموعة ممكنة من المهارات. يجب أن يكون المبرمج أولاً قادرًا على تحليل المشكلات وحلها - فهذه هي المهارة الرئيسية التي يجب أن يكتسبها خريجو علوم الكمبيوتر. كتابة الكود هي ببساطة أداة ضرورية تُستخدم لحل المشكلات. من يعرف المهارات التي ستحتاجها في المستقبل؟ وبالتالي ، فإن نظرية التدريس هي الأفضل من وجهة نظر التعليم. يمكن تطبيق المهارات المكتسبة في أي مجال ، ولن يكون من الصعب تعلم مكتبة أو إطار عمل بقاعدة معرفية جيدة. من المفارقات أن الأشخاص الذين يطرحون أسئلة حول الحاجة إلى الخوارزميات ، كقاعدة عامة ، لديهم بعض المعرفة في هذا المجال. لا أتذكر شخصًا واحدًا لم يكن لديه معرفة في مجال نظرية الحسابات ، فصرخ عليها بفخر ، مدعيًا أنه ليس بحاجة إليها.

إذن ، أنت مبرمج مجرد في فراغ ، لقد عملت لأكثر من عشر سنوات في تثبيت مواقع الويب وحل مهام بسيطة من نفس النوع للعملاء / الشركات. تشعر بالراحة والراحة في مكانتك ، ويكون مؤلمًا بشكل مؤلم فقط للوقت الضائع في الفصل حول نظرية الحساب والتحليل الحسابي ، والذي لم يمنحك شيئًا. في الصباح ، عند إشعال سيجارة فوق فنجان قهوة ، في أعماق تأملات فلسفية حول هشاشة الحياة ، تتساءل: لماذا يحتاج المبرمجون الذين لا يحلون المشكلات المعقدة إلى معرفة الخوارزميات وأساسيات التحليل. الإجابة المختصرة هي أن تكون شخصًا ماهرًا وتستفيد بشكل فعال من الأدوات المتاحة ، بما في ذلك اللغة التي تكتب بها. لا تعلم نظرية الخوارزميات والتحليل فقط الخوارزميات الغريبة وهياكل البيانات في شكل AVL وأشجار حمراء سوداء. كما يوفر نظرة ثاقبة حول كيفية تنظيم البيانات بكفاءة ، وكيفية كتابة التعليمات البرمجية لتحقيق أقصى أداء ، وحيث يكون الاختناق ممكنًا في النظام ، وكيفية التعامل معه. أنت على دراية بالحلول الجاهزة حتى لا تكتب دراجات ، ولا تركض إلى Google في كل مرة تحتاج فيها إلى عمل شيء غير تافه.

يتم استخدام المعرفة بنظرية التحليل والخوارزميات من قبل جميع المبرمجين كل يوم ، فقط لأننا معتادون على هذه الأشياء لدرجة أننا لا نفكر فيها. مهما كانت المشكلة التي تحلها - سواء كانت موقعًا بسيطًا به جلب بيانات من قاعدة بيانات ، أو برنامج نصي bash على الخادم ، فستستخدم نوعًا من بنية البيانات. على الأقل مصفوفة بدائية ، وعلى الأرجح شيء أكثر تعقيدًا. تمنحنا اللغات العديد من التراكيب المختلفة ، والعديد منها قابل للتبادل. غالبًا ما يكون لدينا العديد من الاختلافات من نفس النوع المجرد بتطبيقات مختلفة. على سبيل المثال ، يحتوي C ++ على هياكل بيانات متجهية وقائمة. كيف يختلفون ، وما هي مزايا وعيوب استخدام أحدهما أو الآخر؟ كيف يتم تطبيق الخريطة في C ++ ، وكيف تختلف عن الخرائط المتعددة؟ كيف يتم تنفيذ القائمة في Python - عبر مصفوفة أو قائمة مرتبطة وما هي أفضل طريقة للعمل معها؟ لماذا من غير المرغوب فيه استخدام ArrayList في C # واستخدام List بدلاً من ذلك؟ كيف يتم تنفيذ SortedDictionary وكيف سيؤثر على تنفيذ البرنامج إذا تم استخدامه بدلاً من القاموس؟ كيف يعمل الاستمرارية ومتى يجب استخدامه وهل هناك آثار جانبية عند استخدامه؟ متى كانت آخر مرة استخدمت فيها الوظائف المشوشة الموجودة في كل لغة تقريبًا؟ إذا كنت تعتقد أن الخريطة في C ++ يتم تنفيذها كجدول تجزئة ، فأنت مخطئ. يتم تنفيذه في الأشجار ذات اللون الأحمر والأسود ، ويتم تنفيذ جدول التجزئة في خريطة غير مرتبة. يجب أن نذكر أيضًا البرمجة الديناميكية. إن فهم ماهيتها ، وكيف يمكنك إعادة كتابة الوظائف العودية على النحو الأمثل ، وما هو الحفظ ، سيساعدك غالبًا على تجنب التعرض لضربة في القدم. وبالتالي ، فقط من أجل الاستخدام الكامل والفعال للغة التي تكتب بها ، فأنت بحاجة بالفعل إلى معرفة سطحية على الأقل بهياكل البيانات وما هي وكيف يمكن أن تؤثر على تنفيذ برنامجك.

لكن ماذا عن المكتبات؟ بعد كل شيء ، لقد حلوا الكثير من المشاكل! لاستخدام المكتبات بكفاءة ، تحتاج أيضًا إلى فهمها. أولاً ، يمكن أن يكون للوظائف الموجودة في المكتبة آثار جانبية أو سلوك لن تعرفه دون فهم الخوارزميات. بعد تلقيك خطأ في هذه الحالة ، يمكنك محاولة التقاطه لفترة طويلة وبإصرار وتحديد متى كان من الممكن تجنبه. ثانيًا ، غالبًا ما تحتاج الأدوات والمكتبات المختلفة إلى "ضبط" - لإخبارهم بالخوارزميات وهياكل البيانات والتقنيات التي يجب استخدامها داخليًا. بدون المعرفة الأساسية ، سيكون عليك إما الذهاب لقراءة Mana ، أو الاختيار عشوائيًا. ثالثًا ، هناك العديد من المهام التي لا يمكن حلها عن طريق استدعاء بسيط لواجهة برمجة التطبيقات الخاصة بمكتبة أو إطار عمل. ماذا ستفعل في هذه الحالة؟ قضاء ساعات في البحث عن حلول ممكنة وطلب المساعدة من صديق؟ رابعًا ، يمكن حل العديد من المهام بكل بساطة ببضعة أسطر من التعليمات البرمجية أو تسهيلات اللغة المضمنة. إذا قمت بسحب مكتبة لحل كل عطسة ، فستكون برامجك عبارة عن وحوش عملاقة ، تشغل مئات الميجابايت أو أكثر على القرص ، وتستهلك كل الذاكرة الموجودة على الخادم ، وفي نفس الوقت تكون وظائفها ضئيلة إلى حد ما. بالإضافة إلى ذلك ، فإن وجود مجموعة من المكتبات المرتبطة يستلزم مشاكل في التوافق ، وقد يتعطل البرنامج بشكل عشوائي بسبب السلوك الغريب للعديد من المكتبات في مشروع واحد. يمكن أن يؤدي الاستخدام المتهور للمكتبات إلى عواقب وخيمة ، ولن يتم تقدير المطورين الذين يعرفون فقط كيفية استخدام المكتبات ، ولكنهم غير قادرين على حل مشكلة بسيطة بمفردهم ، لأن حلولهم لن تكون تنافسية.

عمل معي مبرمج واحد بخبرة تزيد عن عشر سنوات. بمجرد أن احتجنا إلى وظيفة لم تدعمها المكتبة التي استخدمناها في ذلك الوقت: التفاف نص بدائي في أحد المكونات المرئية. رأى هذا "المبرمج" أنه من المستحيل القيام بذلك بالوسائل القياسية ، وأعلن على الفور أن تنفيذ مثل هذه الوظيفة مستحيل. تم حل المشكلة من قبل متدرب في السنة الثالثة لديه عقل تحليلي ، والذي كتب خوارزمية بسيطة في ساعتين وطبقها في المكون المطلوب. لقد ورثت مشروعًا آخر في شكل موقع على شبكة الإنترنت. تتكون الصفحة الرئيسية من عدة رسوم بيانية صغيرة ، واستغرق تحميلها ما يقرب من 10 ثوانٍ. اتضح أن الشخص الذي قام بهذا المشروع في الأصل قام بتجميع مجموعة من الهياكل الرهيبة للحلقات الثلاثية المتداخلة ، والتي أخذت البيانات من قاعدة البيانات لفترة طويلة وللأسف ، ثم ربطتها بالرسوم البيانية. بعد القليل من إعادة البناء ، بدأت الصفحة في التحميل على الفور تقريبًا.

هل يستطيع المبرمج الاستغناء عن المعرفة بالخوارزميات ونظرية التحليل؟ ربما هناك الكثير من هؤلاء "المبرمجين". سيكون من المبالغة أن نطلق عليهم اسم المبرمجين. يأتي إلي الكثير من المبرمجين لإجراء مقابلة ، ولديهم خبرة من عشرة إلى خمسة عشر عامًا ، ولا يفهمون حقًا ما يفعلونه ولماذا. لديهم مكانة خاصة بهم ، ينتقلون من شركة إلى أخرى دون البقاء فيها لأكثر من عام. كقاعدة عامة ، لديهم مجموعة صغيرة من المهام التي يمكنهم حلها ، وإذا اتخذت خطوة جانبًا ، فسيضيع الشخص ويحتاج إلى تعليم نفسه مهارات جديدة. هؤلاء الأشخاص مدعوون إلى المشروع ، ويتخلصون منهم في أسرع وقت ممكن ، لأنهم يضيعون الكثير من الوقت في إعادة اختراع الدراجات وقراءة المانا لمعرفة ما كان يجب أن يعرفوه من الجامعة. عادة ما لا يكون لديهم الكثير من الوظائف والأرباح غير المستقرة.

في النهاية ، لماذا تحتاج إلى معرفة الخوارزميات ونظرية التحليل ، إذا كان بإمكانك العمل بدون هذه المعرفة؟ أن نكون متخصصين مؤهلين في مهنتهم ، وأن يتمتعوا بالنمو الوظيفي والاحترام من الزملاء. من أجل حل المهام المعينة بشكل فعال وعدم إعادة اختراع العجلة. من أجل عدم كتابة الوحوش مع عدد هائل من مكتبات الطرف الثالث التي تستهلك مئات الميجابايت من مساحة القرص ، فإنها تستهلك الكثير من الذاكرة على الخادم وتسقط بانتظام لسبب عشوائي اعتمادًا على مرحلة القمر. لتحقيق أقصى استفادة من اللغة التي تكتب بها. اتخاذ قرارات مستنيرة وذات مغزى بشأن اختيار المكتبة والتكنولوجيا لحل المشكلة. إذا كانت مهمتك هي كتابة استعلام SQL وقيادة أمر إلى وحدة التحكم ، فأنا أريد أن أزعجك: فأنت لست مبرمجًا ، فأنت مستخدم ، ولا تحتاج حقًا إلى خوارزميات وأمثاله ، وقد أهدرت الوقت في الجامعة لأنه يكفي لمثل هذا العمل إكمال الدورات أو قراءة كتابين تمهيديين بنفسك.

تتمثل الخطوة الأولى لفهم أهمية التعلم ومعرفة الخوارزميات في تحديد ما تعنيه الخوارزمية بالضبط. وفقًا للكتاب الشهير "الخوارزميات: البناء والتحليل" (Cormen و Leiserson و Rivest و Stein) ، فإن "الخوارزمية هي أي إجراء حسابي محدد جيدًا ، يكون إدخاله عبارة عن قيمة معينة أو مجموعة من القيم ، والنتيجة هي الإخراج (الإخراج) قيمة أو مجموعة من القيم ". بعبارة أخرى ، تشبه الخوارزميات خرائط طريق لتحقيق هدف محدد جيدًا. جزء من الكود لحساب أعضاء متوالية فيبوناتشي هو تنفيذ لخوارزمية محددة. حتى الوظيفة البسيطة لإضافة رقمين هي خوارزمية ، وإن كانت بسيطة.

بعض الخوارزميات ، على سبيل المثال ، لحساب تسلسل فيبوناتشي ، بديهية وتتعلق بالمهارات الفطرية في التفكير المنطقي وحل المشكلات. ومع ذلك ، لن يخطئ معظمنا في تعلم الخوارزميات المعقدة حتى نتمكن في المستقبل من استخدامها كوحدات بناء لحل المشكلات المنطقية بشكل أكثر كفاءة. في الواقع ، قد تفاجأ بمعرفة عدد الخوارزميات المعقدة التي يستخدمها الأشخاص عند التحقق من البريد الإلكتروني أو الاستماع إلى الموسيقى. تقدم هذه المقالة بعض الأفكار الأساسية لتحليل الخوارزمية مع أمثلة عملية لتوضيح أهمية خوارزميات التعلم.

تحليل وقت تنفيذ الخوارزمية

أحد أهم جوانب الخوارزمية هو سرعتها. غالبًا ما يكون من السهل التوصل إلى خوارزمية تحل مشكلة ما ، ولكن إذا كانت الخوارزمية بطيئة جدًا ، فإنها تعود للمراجعة. نظرًا لأن السرعة الدقيقة للخوارزمية تعتمد على مكان تشغيل الخوارزمية بالإضافة إلى تفاصيل التنفيذ ، يتحدث علماء الكمبيوتر عادةً عن وقت التنفيذ بالنسبة للإدخال. على سبيل المثال ، إذا كان الإدخال يتكون من عدد صحيح N ، فقد يكون للخوارزمية وقت تنفيذ يتناسب مع N 2 ، والذي يتم تمثيله على أنه O (N 2). هذا يعني أنك إذا قمت بتشغيل تنفيذ الخوارزمية على جهاز كمبيوتر بإدخال بحجم N ، فسوف يستغرق الأمر C * N 2 ثانية ، حيث C هي بعض الثوابت التي لا تتغير مع حجم الإدخال.

ومع ذلك ، فإن وقت تنفيذ العديد من الخوارزميات المعقدة لا يعتمد فقط على حجم بيانات الإدخال ، ولكن أيضًا على العديد من العوامل الأخرى. على سبيل المثال ، يمكن أن تكون خوارزمية لفرز مجموعة من الأعداد الصحيحة أسرع بكثير إذا كانت المجموعة مرتبة بالفعل. من المعتاد الحديث عن أسوأ حالات الإعدام ومتوسط ​​حالات الإعدام. أسوأ وقت تنفيذ هو أقصى وقت تنفيذ للخوارزمية بأسوأ إدخال ممكن على الإطلاق. متوسط ​​حالة التنفيذ هو متوسط ​​وقت تشغيل الخوارزمية على جميع المدخلات الممكنة. من بين هذين النوعين من وقت التشغيل ، يكون السيناريو الأسوأ هو الأسهل وبالتالي يتم استخدامه بشكل أكثر شيوعًا كمرجع لخوارزمية معينة. يمكن أن تكون عملية تحديد وقت تنفيذ الحالة الأسوأ ومتوسط ​​الحالة لخوارزمية معقدة للغاية بسبب عادة ما يكون من المستحيل تشغيل الخوارزمية لجميع المدخلات الممكنة.

فرز

يعتبر الفرز مثالًا جيدًا على الخوارزمية التي يستخدمها المبرمجون غالبًا. أسهل طريقة لفرز مجموعة من العناصر هي البدء بإزالة العنصر الأصغر من المجموعة ووضعه أولاً. ثم تتم إزالة ثاني أكبر عنصر ووضعه في المرتبة الثانية ، وهكذا. لسوء الحظ ، فإن وقت تشغيل هذه الخوارزمية هو O (N 2) ، مما يعني أنها ستستغرق قدرًا من الوقت يتناسب مع عدد العناصر المربعة. إذا كان علينا فرز مليارات العناصر ، فستتطلب هذه الخوارزمية 10 18 عملية. بافتراض أن أجهزة الكمبيوتر المكتبية النموذجية تقوم بما يقرب من 10 9 عمليات في الثانية ، فسوف يستغرق الأمر سنوات لإنهاء فرز تلك المليارات من العناصر.

لحسن الحظ ، هناك عدد من الخوارزميات الأكثر تقدمًا ، مثل الفرز السريع ، والفرز المتراكم ، والترتيب المدمج. هذه الخوارزميات لها وقت تشغيل O (N * Log (N)). وبالتالي ، يتم تقليل عدد العمليات المطلوبة لفرز مليارات العناصر إلى مستوى معقول بحيث يمكن حتى لأرخص أجهزة كمبيوتر سطح المكتب إجراء مثل هذا النوع. بدلاً من المليارات المربعة من العمليات (10 18) ، تتطلب هذه الخوارزميات 10 مليارات عملية فقط (10 10) ، أي 100 مليون أسرع.

أقصر طريق

خوارزميات للعثور على أقصر طريق من نقطة إلى أخرى تم البحث لسنوات عديدة. هناك الكثير من الأمثلة على التطبيقات المطبقة لهذه الخوارزميات ، ولكن من أجل بساطة العرض ، سوف نلتزم بالعبارة التالية: مطلوب العثور على أقصر طريق من النقطة أ إلى النقطة ب في مدينة بها العديد من الشوارع والتقاطعات. هناك العديد من الخوارزميات المختلفة لحل هذه المشكلة ، ولكل منها مزاياها وعيوبها. قبل أن نتعمق فيها ، دعونا نلقي نظرة على وقت تنفيذ خوارزمية القوة الغاشمة البسيطة. إذا نظرت الخوارزمية في كل مسار ممكن من A إلى B (والذي لا يشكل دورات) ، فمن غير المرجح أن ينتهي في حياتنا ، حتى لو كان A و B في بلدة صغيرة. وقت تنفيذ هذه الخوارزمية أسي ، ويُشار إليه على أنه O (C N) لبعض C. حتى بالنسبة للقيم الصغيرة لـ C ، يصبح C N عددًا فلكيًا عندما يكون N كبيرًا بشكل معتدل.

واحدة من أسرع الخوارزميات لحل هذه المشكلة لها وقت تشغيل O (E * V * Log (V)) ، حيث E هو عدد أجزاء الطريق و V هو عدد التقاطعات. ستستغرق الخوارزمية حوالي ثانيتين للعثور على أقصر مسار في مدينة بها 10000 تقاطع و 20000 مقطع طريق (عادةً ما يكون هناك جزءان من الطريق لكل تقاطع). تُعرف هذه الخوارزمية باسم خوارزمية Dijkstra ، وهي معقدة للغاية وتتطلب استخدام بنية بيانات قائمة انتظار ذات أولوية. ومع ذلك ، في بعض الحالات ، يكون وقت التشغيل بطيئًا للغاية (خذ ، على سبيل المثال ، العثور على أقصر طريق من نيويورك إلى سان فرانسيسكو - هناك ملايين التقاطعات في الولايات المتحدة) ، في مثل هذه الحالات يحاول المبرمجون تحسين وقت التشغيل باستخدام ذلك الاستدلال يسمى. الاستدلال هو قيمة تقريبية لشيء ذي صلة بالمهمة. في مهمة العثور على أقصر مسار ، على سبيل المثال ، قد يكون من المفيد معرفة مدى بُعد نقطة عن الوجهة. بمعرفة ذلك ، يمكنك تطوير خوارزمية أسرع (على سبيل المثال ، تعمل خوارزمية البحث A * في بعض الحالات بشكل أسرع بكثير من خوارزمية Dijkstra). لا يؤدي هذا النهج دائمًا إلى تحسين وقت تنفيذ الخوارزمية في أسوأ حالة ، ولكن في معظم تطبيقات الحياة الواقعية ، تبدأ الخوارزمية في العمل بشكل أسرع.

الخوارزميات التقريبية

في بعض الأحيان ، حتى الخوارزمية الأكثر تقدمًا ذات الأساليب الاستدلالية الأكثر تقدمًا تكون بطيئة جدًا على أسرع جهاز كمبيوتر. في مثل هذه الحالات ، من الضروري تقليل دقة النتيجة النهائية. بدلاً من محاولة الحصول على أقصر طريق ، يمكنك تقييد نفسك بمسار يكون ، على سبيل المثال ، 10٪ أكثر من أقصر طريق.

في الواقع ، هناك العديد من المهام المهمة التي تنتج عنها الخوارزميات المعروفة حاليًا نتيجة مثالية ببطء شديد. أشهر مجموعة من هذه المشاكل تسمى NP (متعدد الحدود غير القطعي). إذا كانت المشكلة تسمى NP-complete أو NP-hard ، فهذا يعني أنه لا أحد يعرف طريقة جيدة بما يكفي للحصول على الحل الأمثل. بالإضافة إلى ذلك ، إذا طور شخص ما خوارزمية فعالة لحل مشكلة NP-hard ، فيمكن تطبيق هذه الخوارزمية على جميع مشكلات NP-hard.

مثال جيد لمشكلة NP-hard هي مشكلة بائع متجول. يريد البائع زيارة مدن N وهو يعرف المدة التي يستغرقها الانتقال من مدينة إلى أخرى. السؤال هو ، ما مدى سرعة زيارة جميع المدن؟ أسرع خوارزمية معروفة لحل هذه المشكلة بطيئة للغاية - ويعتقد الكثيرون أنها ستكون كذلك دائمًا - لذلك يبحث المبرمجون عن خوارزميات سريعة بما يكفي لتقديم حل جيد ، ولكن غالبًا ليس الحل الأمثل.

خوارزميات عشوائية

طريقة أخرى تستخدم لحل بعض المشاكل هي جعل الخوارزمية عشوائية. لا يؤدي هذا الأسلوب إلى تحسين وقت الخوارزمية في أسوأ الحالات ، ولكنه غالبًا ما يعمل بشكل جيد في الحالة الوسطى. تعد خوارزمية الفرز السريع مثالًا جيدًا على استخدام التوزيع العشوائي. في أسوأ الحالات ، تقوم خوارزمية الفرز السريع بفرز مجموعة من العناصر في O (N 2) ، حيث N هو عدد العناصر. إذا تم استخدام التوزيع العشوائي في هذه الخوارزمية ، فإن فرص أسوأ الحالات تصبح ضئيلة ، وفي المتوسط ​​، تعمل خوارزمية الفرز السريع في وقت O (N * Log (N)). تضمن الخوارزميات الأخرى وقت تشغيل O (N * Log (N)) حتى في أسوأ الحالات ، لكنها أبطأ في المتوسط. على الرغم من أن كلا الخوارزميتين لهما وقت تشغيل يتناسب مع N * Log (N) ، إلا أن خوارزمية الفرز السريع لها عامل ثابت أصغر - أي يتطلب C * N * Log (N) بينما تتطلب الخوارزميات الأخرى أكثر من 2 * C * N * Log (N) عمليات.

خوارزمية أخرى تستخدم أرقامًا عشوائية تبحث عن الوسيط لمجموعة من الأرقام ومتوسط ​​وقت تشغيلها هو O (N). هذا أسرع بكثير مقارنة بالخوارزمية التي تفرز الأرقام وتأخذ المتوسط ​​، وتعمل في O (N * Log (N)). هناك خوارزميات حتمية (ليست عشوائية) تسمح لك بالعثور على الوسيط في الوقت O (N) ، لكن الخوارزمية العشوائية يسهل فهمها وغالبًا ما تعمل بشكل أسرع من هذه الخوارزميات الحتمية.

الفكرة الرئيسية لخوارزمية البحث الوسيط هي اختيار رقم عشوائي من بين الأرقام وحساب عدد الأرقام في المجموعة الأقل من الرقم المحدد. لنفترض أن هناك أرقام N ، K منها أقل من أو تساوي الرقم المحدد. إذا كانت K أقل من نصف N ، فإننا نعلم أن الوسيط هو الرقم (N / 2-K) الذي هو أكبر من الرقم العشوائي ، لذلك نتجاهل أرقام K أقل من أو تساوي الرقم العشوائي. لنفترض الآن أننا نريد إيجاد العدد الأصغر (N / 2-K) بدلاً من الوسيط. الخوارزمية هي نفسها ، نحن فقط نختار رقمًا عشوائيًا ونكرر الخطوات الموضحة.

ضغط

تم تصميم فئة أخرى من الخوارزميات لضغط البيانات. لا تحتوي هذه الخوارزمية على النتيجة المتوقعة (مثل خوارزمية الفرز) ، ولكنها بدلاً من ذلك تقوم بالتحسين وفقًا لبعض المعايير. في حالة ضغط البيانات ، تحاول الخوارزمية (على سبيل المثال ، LZW) جعل البيانات تأخذ أقل عدد ممكن من البايتات ، ولكن في نفس الوقت ، بحيث يمكن فك ضغطها إلى شكلها الأصلي. في بعض الحالات ، يستخدم هذا النوع من الخوارزميات نفس التقنيات المستخدمة في الخوارزميات الأخرى ، مما يؤدي إلى نتيجة جيدة ، ولكن ليس الأمثل. على سبيل المثال ، تقوم JPG و MP3 بضغط البيانات بطريقة تجعل النتيجة النهائية أقل جودة من الأصلية ، ولكن الحجم أصغر. لا يحافظ ضغط MP3 على كل جانب من جوانب ملف الصوت الأصلي ، ولكنه يحاول الحفاظ على تفاصيل كافية لتوفير جودة مقبولة مع تقليل حجم الملف بشكل كبير. يتبع تنسيق JPG نفس المبدأ ، لكن التفاصيل مختلفة تمامًا لأن الهدف هو ضغط الصورة وليس الصوت.

لماذا من المهم جدا معرفة الخوارزميات

من أجل استخدام الخوارزميات بشكل صحيح ، من المهم معرفة جميع أنواع الخوارزميات المذكورة. إذا كان عليك تطوير برنامج مهم ، فيجب أن تكون قادرًا على تقدير سرعة الخوارزمية الخاصة بك. تعتمد دقة تقديرك على كفاءتك في تحليل وقت تنفيذ الخوارزميات. بالإضافة إلى ذلك ، تحتاج إلى معرفة تفاصيل الخوارزميات ، والتي ستسمح بالتنبؤ بالحالات الخاصة التي لن يعمل فيها البرنامج بسرعة أو ستعطي نتائج غير مقبولة.

بالطبع ، ستكون هناك أوقات تعثر فيها في مشاكل لم يتم استكشافها من قبل. في مثل هذه الحالات ، تحتاج إلى ابتكار خوارزمية جديدة ، أو إعادة تطبيق الخوارزمية القديمة. كلما زادت معرفتك بالخوارزميات ، زادت احتمالية عثورك على حل جيد لمشكلة ما. في كثير من الحالات ، يمكن اختزال مهمة جديدة بسهولة إلى مهمة قديمة ، لكن هذا يتطلب فهمًا أساسيًا للمهام القديمة.

كمثال ، ضع في اعتبارك كيفية عمل محولات الشبكة. يحتوي المحول على كبلات N متصلة به ، ويستقبل حزمة البيانات التي تصل إلى هذه الكابلات. يجب أن يقوم المحول أولاً بتحليل الحزم ثم إرسالها مرة أخرى عبر الكبل الصحيح. يعمل المحول ، مثل الكمبيوتر ، في وضع منفصل - يتم إرسال الحزم في فترات منفصلة ، وليس بشكل مستمر. يميل المفتاح السريع إلى إرسال أكبر عدد ممكن من الحزم خلال كل فترة زمنية ، وإلا فسوف تتراكم وسوف "يتعطل" المفتاح. الهدف من الخوارزمية هو إرسال أكبر عدد ممكن من الحزم خلال كل فترة زمنية ، وكذلك ضمان الترتيب الذي يتم به إرسال الحزم التي وصلت في وقت أبكر من غيرها أيضًا. في هذه الحالة ، اتضح أن الخوارزمية المعروفة باسم "المطابقة المستقرة" مناسبة لحل هذه المشكلة ، على الرغم من أن هذا قد لا يكون واضحًا للوهلة الأولى. لا يمكن اكتشاف مثل هذه الروابط بين المشكلة والحل إلا بمساعدة المعرفة الخوارزمية الموجودة بالفعل.

أمثلة حقيقية

هناك الكثير من الأمثلة لحل المشكلات الحقيقية التي تتطلب أحدث الخوارزميات. يعتمد كل ما تفعله على جهاز الكمبيوتر تقريبًا على الخوارزميات التي طورها شخص ما لفترة طويلة جدًا. حتى أبسط البرامج لن تكون موجودة بدون الخوارزميات التي تعمل خلف الكواليس لإدارة الذاكرة وتحميل البيانات من القرص الصلب.

هناك العشرات من الأمثلة على استخدام الخوارزميات المعقدة ، لكننا سنناقش مشكلتين ، يتطلب حلهما نفس المهارات لحل بعض المشكلات في TopCoder. تُعرف المشكلة الأولى بمشكلة التدفق الأقصى ، والثانية مرتبطة بالبرمجة الديناميكية - وهي طريقة تتيح لك غالبًا حل المشكلات بسرعة البرق التي تبدو مستحيلة.

غالبًا ما توجد مقالات مثل "هل يحتاج المبرمج إلى خوارزميات" ، وكلها لها نفس النموذج تقريبًا. يكتب مؤلف المقال عادةً: "لقد كنت أكتب مواقع / نصوصًا في 1C لمدة N سنوات ، ولم أستخدم أبدًا الخوارزميات أو هياكل البيانات. كما يستشهد كمثال بالأشجار ذات اللون الأحمر والأسود أو بعض الهياكل الغريبة الأخرى ، والتي لا تُرى غالبًا في المنطقة التي يعمل فيها المؤلف ، على كل حال. تتلخص هذه المقالات في حقيقة أن المبرمجين في منطقة معينة لا يستخدمون هياكل بيانات معقدة ولا يحلون مشاكل NP.

إن صياغة مثل هذا السؤال هي خاطئة من حيث الأساس. يتزايد عدد التخصصات في الصناعة باستمرار ، والشخص الذي يكتب المواقع على .net سيفعل أشياء مختلفة تمامًا عن الشخص الذي يكتب برامج تشغيل لأجهزة الاستشعار في بنية ARM في ظل نظام تشغيل غريب. دعنا أولاً نحدد ما هي الخوارزمية. بشكل غير رسمي ، يعرّف Cormen الخوارزمية كإجراء محدد جيدًا يأخذ قيمة واحدة أو أكثر كمدخلات ويعيد قيمة واحدة أو أكثر كنتيجة لذلك. بشكل رسمي ، يتم تعريف الخوارزمية في نماذج حسابية مختلفة: العمليات التي يمكن إجراؤها على آلة تورينج أو باستخدام حساب لامدا. لذا فإن أي كود يقوم بشيء ما هو خوارزمية. اتضح أن السؤال "هل يحتاج المبرمج إلى خوارزميات" يمكن ترجمته على أنه "هل يحتاج المبرمج إلى أن يكون قادرًا على كتابة التعليمات البرمجية". يجب أن يبدو السؤال الصحيح مثل: "هل يحتاج مبرمج في الصناعة X إلى معرفة الخوارزميات المتقدمة وتفاصيل نظرية الحساب".

إذا نظرت إلى كل هذه المقالات ، ستلاحظ أن الأشخاص الذين يكتبونها قد شعروا بالإهانة من قبل الجامعات لإجبارهم على تعلم الكثير من المواد المعقدة - في شكل تحليل حسابي وخوارزميات معقدة وهياكل بيانات - والتي بدت لهم لتكون بلا فائدة ... في الواقع ، إن مؤلفي المقالات مستاءون من الجامعات لأنهم لم يتمكنوا من التنبؤ بمجال العمل المستقبلي للمؤلفين ومنحهم فقط الحد الأدنى من مجموعة المهارات اللازمة. في الواقع ، من أجل كتابة مواقع ونصوص بسيطة ، لا تحتاج إلى معرفة خاصة بالخوارزميات وهياكل البيانات. أم أنها لا تزال ضرورية؟

دعونا نفكر فيما يحتاج مبرمج الجامعة إلى تدريسه من أجل اكتساب المهارات اللازمة لمهنة ناجحة. مكتبات؟ إطار أعمال؟ لقد أصبحت قديمة ، وتتغير واجهاتهم ، وكلها مكتوبة في أغلب الأحيان بلغة واحدة ، والتي قد لا يستخدمها الطلاب أبدًا في الصناعة. لتعليم الجميع لكتابة المواقع؟ أو تعليم الجميع كتابة نظام تشغيل؟ يجب أن يصل التعليم إلى أكبر عدد ممكن من الجمهور وأن يوفر أكبر مجموعة ممكنة من المهارات. يجب أن يكون المبرمج أولاً قادرًا على تحليل المشكلات وحلها - فهذه هي المهارة الرئيسية التي يجب أن يكتسبها خريجو علوم الكمبيوتر. كتابة الكود هي ببساطة أداة ضرورية تُستخدم لحل المشكلات. من يعرف المهارات التي ستحتاجها في المستقبل؟ وبالتالي ، فإن نظرية التدريس هي الأفضل من وجهة نظر التعليم. يمكن تطبيق المهارات المكتسبة في أي مجال ، ولن يكون من الصعب تعلم مكتبة أو إطار عمل بقاعدة معرفية جيدة. من المفارقات أن الأشخاص الذين يطرحون أسئلة حول الحاجة إلى الخوارزميات ، كقاعدة عامة ، لديهم بعض المعرفة في هذا المجال. لا أتذكر شخصًا واحدًا لم يكن لديه معرفة في مجال نظرية الحسابات ، فصرخ عليها بفخر ، مدعيًا أنه ليس بحاجة إليها.

إذن ، أنت مبرمج مجرد في فراغ ، لقد عملت لأكثر من عشر سنوات في تثبيت مواقع الويب وحل مهام بسيطة من نفس النوع للعملاء / الشركات. تشعر بالراحة والراحة في مكانتك ، ويكون مؤلمًا بشكل مؤلم فقط للوقت الضائع في الفصل حول نظرية الحساب والتحليل الحسابي ، والذي لم يمنحك شيئًا. في الصباح ، عند إشعال سيجارة فوق فنجان قهوة ، في أعماق تأملات فلسفية حول هشاشة الحياة ، تتساءل: لماذا يحتاج المبرمجون الذين لا يحلون المشكلات المعقدة إلى معرفة الخوارزميات وأساسيات التحليل. الإجابة المختصرة هي أن تكون شخصًا ماهرًا وتستفيد بشكل فعال من الأدوات المتاحة ، بما في ذلك اللغة التي تكتب بها. لا تعلم نظرية الخوارزميات والتحليل فقط الخوارزميات الغريبة وهياكل البيانات في شكل AVL وأشجار حمراء سوداء. كما يوفر نظرة ثاقبة حول كيفية تنظيم البيانات بكفاءة ، وكيفية كتابة التعليمات البرمجية لتحقيق أقصى أداء ، وحيث يكون الاختناق ممكنًا في النظام ، وكيفية التعامل معه. أنت على دراية بالحلول الجاهزة حتى لا تكتب دراجات ، ولا تركض إلى Google في كل مرة تحتاج فيها إلى عمل شيء غير تافه.

يتم استخدام المعرفة بنظرية التحليل والخوارزميات من قبل جميع المبرمجين كل يوم ، فقط لأننا معتادون على هذه الأشياء لدرجة أننا لا نفكر فيها. مهما كانت المشكلة التي تحلها - سواء كانت موقعًا بسيطًا به جلب بيانات من قاعدة بيانات ، أو برنامج نصي bash على الخادم ، فستستخدم نوعًا من بنية البيانات. على الأقل مصفوفة بدائية ، وعلى الأرجح شيء أكثر تعقيدًا. تمنحنا اللغات العديد من التراكيب المختلفة ، والعديد منها قابل للتبادل. غالبًا ما يكون لدينا العديد من الاختلافات من نفس النوع المجرد بتطبيقات مختلفة. على سبيل المثال ، يحتوي C ++ على هياكل بيانات متجهية وقائمة. كيف يختلفون ، وما هي مزايا وعيوب استخدام أحدهما أو الآخر؟ كيف يتم تطبيق الخريطة في C ++ ، وكيف تختلف عن الخرائط المتعددة؟ كيف يتم تنفيذ القائمة في Python - عبر مصفوفة أو قائمة مرتبطة وما هي أفضل طريقة للعمل معها؟ لماذا من غير المرغوب فيه استخدام ArrayList في C # واستخدام List بدلاً من ذلك؟ كيف يتم تنفيذ SortedDictionary وكيف سيؤثر على تنفيذ البرنامج إذا تم استخدامه بدلاً من القاموس؟ كيف يعمل الاستمرارية ومتى يجب استخدامه وهل هناك آثار جانبية عند استخدامه؟ متى كانت آخر مرة استخدمت فيها الوظائف المشوشة الموجودة في كل لغة تقريبًا؟ إذا كنت تعتقد أن الخريطة في C ++ يتم تنفيذها كجدول تجزئة ، فأنت مخطئ. يتم تنفيذه في الأشجار ذات اللون الأحمر والأسود ، ويتم تنفيذ جدول التجزئة في خريطة غير مرتبة. يجب أن نذكر أيضًا البرمجة الديناميكية. إن فهم ماهيتها ، وكيف يمكنك إعادة كتابة الوظائف العودية على النحو الأمثل ، وما هو الحفظ ، سيساعدك غالبًا على تجنب التعرض لضربة في القدم. وبالتالي ، فقط من أجل الاستخدام الكامل والفعال للغة التي تكتب بها ، فأنت بحاجة بالفعل إلى معرفة سطحية على الأقل بهياكل البيانات وما هي وكيف يمكن أن تؤثر على تنفيذ برنامجك.

لكن ماذا عن المكتبات؟ بعد كل شيء ، لقد حلوا الكثير من المشاكل! لاستخدام المكتبات بكفاءة ، تحتاج أيضًا إلى فهمها. أولاً ، يمكن أن يكون للوظائف الموجودة في المكتبة آثار جانبية أو سلوك لن تعرفه دون فهم الخوارزميات. بعد تلقيك خطأ في هذه الحالة ، يمكنك محاولة التقاطه لفترة طويلة وبإصرار وتحديد متى كان من الممكن تجنبه. ثانيًا ، غالبًا ما تحتاج الأدوات والمكتبات المختلفة إلى "ضبط" - لإخبارهم بالخوارزميات وهياكل البيانات والتقنيات التي يجب استخدامها داخليًا. بدون المعرفة الأساسية ، سيكون عليك إما الذهاب لقراءة Mana ، أو الاختيار عشوائيًا. ثالثًا ، هناك العديد من المهام التي لا يمكن حلها عن طريق استدعاء بسيط لواجهة برمجة التطبيقات الخاصة بمكتبة أو إطار عمل. ماذا ستفعل في هذه الحالة؟ قضاء ساعات في البحث عن حلول ممكنة وطلب المساعدة من صديق؟ رابعًا ، يمكن حل العديد من المهام بكل بساطة ببضعة أسطر من التعليمات البرمجية أو تسهيلات اللغة المضمنة. إذا قمت بسحب مكتبة لحل كل عطسة ، فستكون برامجك عبارة عن وحوش عملاقة ، تشغل مئات الميجابايت أو أكثر على القرص ، وتستهلك كل الذاكرة الموجودة على الخادم ، وفي نفس الوقت تكون وظائفها ضئيلة إلى حد ما. بالإضافة إلى ذلك ، فإن وجود مجموعة من المكتبات المرتبطة يستلزم مشاكل في التوافق ، وقد يتعطل البرنامج بشكل عشوائي بسبب السلوك الغريب للعديد من المكتبات في مشروع واحد. يمكن أن يؤدي الاستخدام المتهور للمكتبات إلى عواقب وخيمة ، ولن يتم تقدير المطورين الذين يعرفون فقط كيفية استخدام المكتبات ، ولكنهم غير قادرين على حل مشكلة بسيطة بمفردهم ، لأن حلولهم لن تكون تنافسية.

عمل معي مبرمج واحد بخبرة تزيد عن عشر سنوات. بمجرد أن احتجنا إلى وظيفة لم تدعمها المكتبة التي استخدمناها في ذلك الوقت: التفاف نص بدائي في أحد المكونات المرئية. رأى هذا "المبرمج" أنه من المستحيل القيام بذلك بالوسائل القياسية ، وأعلن على الفور أن تنفيذ مثل هذه الوظيفة مستحيل. تم حل المشكلة من قبل متدرب في السنة الثالثة لديه عقل تحليلي ، والذي كتب خوارزمية بسيطة في ساعتين وطبقها في المكون المطلوب. لقد ورثت مشروعًا آخر في شكل موقع على شبكة الإنترنت. تتكون الصفحة الرئيسية من عدة رسوم بيانية صغيرة ، واستغرق تحميلها ما يقرب من 10 ثوانٍ. اتضح أن الشخص الذي قام بهذا المشروع في الأصل قام بتجميع مجموعة من الهياكل الرهيبة للحلقات الثلاثية المتداخلة ، والتي أخذت البيانات من قاعدة البيانات لفترة طويلة وللأسف ، ثم ربطتها بالرسوم البيانية. بعد القليل من إعادة البناء ، بدأت الصفحة في التحميل على الفور تقريبًا.

هل يستطيع المبرمج الاستغناء عن المعرفة بالخوارزميات ونظرية التحليل؟ ربما هناك الكثير من هؤلاء "المبرمجين". سيكون من المبالغة أن نطلق عليهم اسم المبرمجين. يأتي إلي الكثير من المبرمجين لإجراء مقابلة ، ولديهم خبرة من عشرة إلى خمسة عشر عامًا ، ولا يفهمون حقًا ما يفعلونه ولماذا. لديهم مكانة خاصة بهم ، ينتقلون من شركة إلى أخرى دون البقاء فيها لأكثر من عام. كقاعدة عامة ، لديهم مجموعة صغيرة من المهام التي يمكنهم حلها ، وإذا اتخذت خطوة جانبًا ، فسيضيع الشخص ويحتاج إلى تعليم نفسه مهارات جديدة. هؤلاء الأشخاص مدعوون إلى المشروع ، ويتخلصون منهم في أسرع وقت ممكن ، لأنهم يضيعون الكثير من الوقت في إعادة اختراع الدراجات وقراءة المانا لمعرفة ما كان يجب أن يعرفوه من الجامعة. عادة ما لا يكون لديهم الكثير من الوظائف والأرباح غير المستقرة.

في النهاية ، لماذا تحتاج إلى معرفة الخوارزميات ونظرية التحليل ، إذا كان بإمكانك العمل بدون هذه المعرفة؟ أن نكون متخصصين مؤهلين في مهنتهم ، وأن يتمتعوا بالنمو الوظيفي والاحترام من الزملاء. من أجل حل المهام المعينة بشكل فعال وعدم إعادة اختراع العجلة. من أجل عدم كتابة الوحوش مع عدد هائل من مكتبات الطرف الثالث التي تستهلك مئات الميجابايت من مساحة القرص ، فإنها تستهلك الكثير من الذاكرة على الخادم وتسقط بانتظام لسبب عشوائي اعتمادًا على مرحلة القمر. لتحقيق أقصى استفادة من اللغة التي تكتب بها. اتخاذ قرارات مستنيرة وذات مغزى بشأن اختيار المكتبة والتكنولوجيا لحل المشكلة. إذا كانت مهمتك هي كتابة استعلام SQL وقيادة أمر إلى وحدة التحكم ، فأنا أريد أن أزعجك: فأنت لست مبرمجًا ، فأنت مستخدم ، ولا تحتاج حقًا إلى خوارزميات وأمثاله ، وقد أهدرت الوقت في الجامعة لأنه يكفي لمثل هذا العمل إكمال الدورات أو قراءة كتابين تمهيديين بنفسك.

لكتابة تطبيقات بمستويات مختلفة من التعقيد ، تحتاج أولاً إلى اكتساب المعرفة حول كيفية القيام بذلك. ومن المستحسن أن نبدأ بأساسيات الخوارزميات والبرمجة. هنا سنتحدث عنها في إطار المقال.

هذا هو اسم علم تقني معقد ، تتمثل مهمته في تنظيم طرق إنشاء ومعالجة ونقل وتخزين وإعادة إنتاج البيانات باستخدامه ، كما يتضمن مبادئ التشغيل وطرق الإدارة التي تساعد على تحقيق الهدف. مصطلح "المعلوماتية" نفسه من أصل فرنسي وهو مزيج من كلمتي "معلومات" و "أتمتة". نشأت بفضل تطوير ونشر تقنيات جديدة لجمع ومعالجة ونقل البيانات ، والتي ارتبطت بتثبيتها على وسائط الكمبيوتر. هذا هو أصل علم الحاسوب. تعتبر أساسيات الخوارزمية والبرمجة من أهم مجالات هذا العلم.

ما الذي تفعله هي؟

للمعلوماتية المهام التالية:

  1. دعم أجهزة وبرامج الكمبيوتر.
  2. وسائل ضمان تفاعل الشخص ومكونات الكمبيوتر مع بعضها البعض.

غالبًا ما يستخدم مصطلح "الواجهة" للإشارة إلى الجزء الفني. هنا لدينا برنامج مجاني. تُستخدم أساسيات الخوارزمية والبرمجة دائمًا لإنشاء منتجات للتوزيع الشامل ، والتي "يجب" أن تكسب جمهورًا واسعًا. في الواقع ، من أجل الشعبية ، يجب أن يعمل التطبيق المطور ويظهر على النحو الأمثل.

عرض الخوارزمية

يمكن كتابتها بعدد كبير من الطرق. الأكثر شيوعًا هي ما يلي:

  1. الوصف اللفظي والصيغة. هذا يعني وضع نص وصيغ محددة تشرح ميزات التفاعل في جميع الحالات الفردية.
  2. مخطط كتلة. إنه يعني وجود رموز بيانية تجعل من الممكن فهم خصائص تفاعل البرنامج داخل نفسه ومع التطبيقات الأخرى أو مكونات الأجهزة في الكمبيوتر. يمكن أن يكون كل منهم مسؤولاً عن وظيفة أو إجراء أو صيغة منفصلة.
  3. وهذا يعني إنشاء طرق منفصلة لوصف حالات محددة ، والتي تُظهر ميزات وتسلسل المهام.
  4. مخططات المشغل. هذا يعني إنشاء نموذج أولي - سيُظهر التفاعل بناءً على المسارات التي ستتخذها المعاملات الفردية.

كود مزيف. رسم تخطيطي للعمود الفقري للبرنامج.

سجل الخوارزمية

كيف تبدأ في إنشاء النموذج الأولي الخاص بك من برنامج أو وظيفة أو إجراء؟ للقيام بذلك ، يكفي استخدام التوصيات العامة التالية:

  1. يجب أن يكون لكل خوارزمية اسم خاص بها يشرح معناها.
  2. تأكد من الاهتمام بوجود البداية والنهاية.
  3. يجب وصف بيانات الإدخال والإخراج.
  4. يجب عليك تحديد الأوامر التي سيتم من خلالها تنفيذ إجراءات معينة على معلومات محددة.

طرق التسجيل

يمكن أن يصل عدد مشاهدات الخوارزمية إلى خمسة. لكن هناك طريقتان فقط للكتابة:

  1. رسمية ولفظية. يتميز بحقيقة أن الوصف يتم بشكل أساسي باستخدام الصيغ والكلمات. المحتوى ، وكذلك تسلسل تنفيذ مراحل الخوارزمية في هذه الحالة ، مكتوب بلغة احترافية طبيعية بأي شكل من الأشكال.
  2. الرسم. الاكثر انتشارا. يستخدم رموز الكتلة أو مخططات الخوارزمية. يظهر الاتصال بينهما باستخدام خطوط خاصة.

نقوم بتطوير هيكل البرنامج

هناك ثلاثة أنواع رئيسية:

  1. خطي. باستخدام هذا الهيكل ، يتم تنفيذ جميع الإجراءات بالتتابع بالترتيب ومرة ​​واحدة فقط. يبدو الرسم التخطيطي كسلسلة من الكتل مرتبة من أعلى إلى أسفل ، اعتمادًا على ترتيب تنفيذها. لا يمكن أن تؤثر البيانات الأولية والمتوسطة المستلمة على اتجاه العملية الحسابية.
  2. المتفرعة. وجدت تطبيقًا واسعًا في الممارسة ، في حل المشكلات المعقدة. لذلك ، إذا كان من الضروري مراعاة الشروط الأولية أو النتائج الوسيطة ، يتم إجراء الحسابات اللازمة وفقًا لها ويمكن أن يتغير اتجاه العملية الحسابية اعتمادًا على النتيجة التي تم الحصول عليها.

دوري. لتسهيل العمل مع العديد من المهام ، من المنطقي تكرار بعض أجزاء كود البرنامج عدة مرات. من أجل عدم وصف عدد المرات وما يجب القيام به ، استخدم بنية دورية. يوفر سلسلة من الأوامر التي سيتم تكرارها حتى يتم استيفاء شرط معين. يمكن أن يقلل استخدام الحلقات بشكل كبير من تعقيد كتابة البرنامج.

برمجة

من المهم أن يتم إنشاء البرامج. وتجدر الإشارة إلى أن العديد منها "شحذ" لظروف عمل محددة (على سبيل المثال ، في المتصفح). بشكل عام ، تنقسم لغات البرمجة إلى مجموعتين:

  1. وظيفي.
  2. المشغل أو العامل:

ليس إجرائيا ؛

إجرائية.

هل يمكنك تخمين أي منها يستخدم غالبًا؟ عامل التشغيل هو الجواب. يمكن أن تكون موجهة نحو الآلة أو مستقلة. الأول يشمل المجمعات ، الأكواد التلقائية ، الترميز الرمزي. ينقسم المستقلون على أساس توجههم:

  • إجرائية.
  • إشكالية.
  • يعارض.

كل منهم له نطاقه الخاص. ولكن بالنسبة لكتابة البرامج (التطبيقات أو الألعاب المفيدة) ، غالبًا ما يتم استخدام اللغات الموجهة للكائنات. بالطبع ، يمكنك استخدام الآخرين ، لكن الحقيقة هي أنهم الأكثر تطورًا لإنشاء منتجات استهلاكية نهائية للجماهير. نعم ، وإذا لم يكن لديك رؤية واضحة من أين تبدأ ، أقترح عليك الانتباه إلى أساسيات الخوارزمية والبرمجة الموجهة للكائنات. الآن هذا اتجاه شائع جدًا ، حيث يمكنك العثور على الكثير من المواد التعليمية. بشكل عام ، هناك حاجة الآن إلى أساسيات الخوارزمية ولغات البرمجة نظرًا لوجود نقص في المطورين المؤهلين ، وستزداد أهميتها في المستقبل فقط.

استنتاج

عند العمل باستخدام الخوارزميات (وبعد ذلك مع البرامج) ، يجب على المرء أن يسعى جاهداً للتفكير في كل التفاصيل ، وصولاً إلى أصغرها. وبالتالي ، فإن تحديد كل قسم غير مشغول من الكود سيؤدي فقط إلى عمل إضافي ، وزيادة في تكاليف التطوير وتوقيت المهمة. سيوفر التخطيط الدقيق والتفصيل لجميع الفروق الدقيقة الوقت والجهد والمال بشكل كبير. حسنًا ، يمكنهم الآن القول أنه بعد قراءة هذا المقال لديك مفهوم حول أساسيات الخوارزميات والبرمجة. يبقى فقط لتطبيق هذه المعرفة. إذا كنت ترغب في دراسة الموضوع بمزيد من التفصيل ، يمكنني أن أوصي بكتاب "أساسيات الخوارزمية والبرمجة" (Semakin ، Shestakov) 2012.