Google: Google: 90٪ من مهندسينا يستخدمون برنامجًا كتبته (Homebrew) ، لكنك لا يمكن قلب شجرة ثنائية على السبورة ، لذا وداعًا.
على الرغم من أنني لم أحتج أبدًا لقلب شجرة ثنائية ، فقد صادفت أمثلة على الاستخدام الحقيقي لهياكل البيانات والخوارزميات في عملي اليومي عندما كنت أعمل في Skype / Microsoft و Skyscanner و Uber . وشمل ذلك الترميز واتخاذ القرار بناءً على خصائص هياكل البيانات والخوارزميات. لكنني ، في الغالب ، استخدمت المعرفة ذات الصلة من أجل فهم كيفية إنشاء أنظمة معينة ، ولماذا تم إنشاؤها بهذه الطريقة. تسهل معرفة المفاهيم ذات الصلة فهم بنية وتنفيذ الأنظمة التي تستخدم فيها هذه المفاهيم.

في هذه المقالة ، قمت بتضمين قصص حول المواقف التي تم فيها استخدام هياكل البيانات مثل الأشجار والرسوم البيانية ، وكذلك العديد من الخوارزميات ، في مشاريع حقيقية. هنا آمل أن أوضح للقارئ أن المعرفة الأساسية بهياكل البيانات والخوارزميات ليست نظرية عديمة الفائدة مطلوبة فقط لإجراء المقابلات ، ولكنها شيء من المرجح جدًا أن يحتاجه شخص يعمل في شركات التكنولوجيا المبتكرة عالية النمو.
هنا سنتحدث عن عدد صغير جدًا من الخوارزميات ، ولكن فيما يتعلق بهياكل البيانات ، يمكنني ملاحظة أنني سأتطرق إلى جميعها تقريبًا هنا. لا ينبغي أن يكون مفاجئًا لأي شخص أنني لست من المعجبين بأسئلة المقابلة التي تفرط في التأكيد على الخوارزميات ، وأنني بعيد عن الممارسة واستهدف هياكل البيانات الغريبة مثل الأشجار الحمراء السوداء أو أشجار AVL لم أطرح مثل هذه الأسئلة في المقابلات ولن أطرحها. في نهاية هذا المقال ، سوف أشارك أفكاري حول هذه المقابلات. ولكن على الرغم مما سبق ، فإن معرفة هياكل البيانات الأساسية لها قيمة هائلة. تتيح لك هذه المعرفة تحديد ما هو مطلوب بالضبط لحل بعض المشكلات العملية.
الآن دعنا ننتقل إلى أمثلة على استخدام هياكل البيانات والخوارزميات في الحياة الواقعية.
اجتياز الأشجار والأشجار: أطر عمل سكايب وأوبر وواجهة المستخدم
عندما كنا نطور Skype for Xbox One ، كان لا بد من كتابة الكود لنظام تشغيل Xbox خالص لا يحتوي على المكتبات التي نحتاجها. لقد قمنا بتطوير أحد التطبيقات الكاملة الأولى لهذه المنصة. كنا بحاجة إلى نظام ملاحة للتطبيق يمكن تشغيله باستخدام كل من شاشة اللمس وإعطاء الأوامر الصوتية للتطبيق.
لقد أنشأنا إطار عمل تنقل أساسيًا يستند إلى WinJS. من أجل القيام بذلك ، احتجنا إلى الحفاظ على رسم بياني يشبه DOM ، والذي كان مطلوبًا لتنظيم مراقبة العناصر التي يمكن للمستخدم التفاعل معها. للعثور على مثل هذه العناصر ، أجرينا اجتياز DOM ، والذي تم اختصاره إلى اجتياز الشجرة ، أي الهيكل الحالي لعناصر DOM. هذا مثال كلاسيكي على BFS أو DFS (بحث العرض أولاً أو بحث العمق أولاً - بحث العرض أولاً أو بحث العمق أولاً).
إذا كنت تقوم بتطوير الويب ، فهذا يعني أنك تعمل بالفعل ببنية شجرة ، وهي DOM. يمكن أن تحتوي جميع عُقد DOM على عُقد فرعية. يعرض المتصفح العقد بعد اجتياز شجرة DOM. إذا كنت بحاجة إلى العثور على عنصر معين ، فيمكنك استخدام طرق DOM المدمجة لحل هذه المشكلة. على سبيل المثال ، طريقة getElementById. البديل هو تطوير حل BFS أو DFS الخاص بك لاجتياز العقد والعثور على ما تحتاجه. على سبيل المثال ، يتم إجراء شيء مماثل هنا .
تستخدم العديد من الأطر التي تعرض عناصر واجهة المستخدم هياكل الأشجار في أعماقها. لذلك ، يدعم React DOM الظاهري ويستخدم خوارزمية تسوية ذكية(مقارنات). يتيح لك ذلك تحقيق أداء عالٍ نظرًا لحقيقة أنه يتم إعادة عرض الأجزاء التي تم تغييرها فقط من الواجهة. و تصور هذه العملية يمكن العثور عليها هنا.
في هندسة الهاتف المحمول Uber، RIBs، وتستخدم أيضا الأشجار. وهذا يجعل هذه البنية مشابهة لمعظم أطر عمل واجهة المستخدم الأخرى التي تعرض الهياكل الهرمية للعناصر. تحتفظ بنية RIBs بشجرة RIB لأغراض إدارة الحالة. يؤدي إرفاق RIBs وفصلها عنها إلى التحكم في عرضها. أثناء العمل مع RIBs ، قمنا أحيانًا بعمل رسومات في محاولة لمعرفة ما إذا كانت RIBs تتناسب مع التسلسل الهرمي الحالي وناقشنا ما إذا كان يجب أن تحتوي RIBs المعنية على عناصر مرئية. أي أنهم تحدثوا عن ما إذا كانت هذه البنية ستشارك في تشكيل العرض المرئي للواجهة ، أم أنها ستستخدم فقط لإدارة الحالة.

انتقالات الحالة عند استخدام RIBs. يمكنك العثور على مزيد من التفاصيل حول RIBs هنا.إذا
احتجت في أي وقت إلى تقديم عناصر هرمية ، فاحذر من استخدام هياكل الشجرة عادةً لهذا الغرض ، حيث يتم عبورها وعرض العناصر التي تمت زيارتها. لقد صادفت العديد من الأدوات الداخلية التي تتبع هذا النهج. مثال على هذه الأداة هو عارض RIBs الذي أنشأه فريق Mobile Platform في Uber. هنا حديث حول هذا الموضوع.
الرسوم البيانية الموزونة وأقصر مسار مكتشف: Skyscanner
Skyscanner هو مشروع يهدف إلى العثور على أفضل الصفقات على تذاكر الطيران. يتم البحث عن مثل هذه المقترحات من خلال عرض وتحليل جميع المسارات الموجودة في العالم والجمع بينها. يرتبط جوهر هذه المهمة بشكل أكبر بجمع البيانات تلقائيًا بواسطة روبوت البحث ، وليس تخزين كل هذه البيانات مؤقتًا ، نظرًا لأن شركات الطيران تحسب بشكل مستقل وقت الانتظار للرحلة التالية. لكن إمكانية التخطيط لرحلة مع زيارة عدة مدن تكمن في مهمة إيجاد أقصر طريق.
كان تخطيط السفر إلى مدن متعددة أحد الاحتمالات التي استغرق تنفيذها Skyscanner وقتًا طويلاً. في الوقت نفسه ، تتعلق الصعوبات بشكل أساسي بالنظام الذي يتم تطويره بنفسه. تم العثور على أفضل الصفقات من هذا النوع باستخدام خوارزميات المسار الأقصر مثل Dijkstra's أو A *. يتم عرض مسارات الطيران في شكل رسم بياني موجه. يتم تعيين وزن لكل من حوافها في شكل سعر تذكرة. عند البحث عن أفضل طريق ، يتم إجراء العثور على أرخص طريق بين مدينتين باستخدام تطبيق خوارزمية A * المعدلة . إذا كنت مهتمًا بموضوع اختيار تذاكر الطيران والعثور على أقصر الطرق ، فإليك مقالة جيدة حول استخدام BFS لحل مثل هذه المشكلات.
ومع ذلك ، في حالة Skyscanner ، لم تكن الخوارزمية المستخدمة لحل المشكلة مهمة بشكل خاص. التخزين المؤقت ، استخدام روبوتات البحث ، تنظيم العمل مع مواقع مختلفة - كل هذا كان أصعب بكثير من اختيار خوارزمية. ولكن في الوقت نفسه ، تظهر متغيرات مختلفة لمشكلة العثور على أقصر طريق في العديد من شركات تخطيط السفر المختلفة وتحسين تكلفة هذه الرحلات. مما لا يثير الدهشة ، كان هذا الموضوع موضوع نقاش من وراء الكواليس في Skyscanner أيضًا.
النوع: سكايب (أو شيء من هذا القبيل)
نادرًا ما كان لدي سبب لتنفيذ خوارزميات الفرز بنفسي أو لدراسة تعقيدات هيكلها بعمق. ولكن على الرغم من ذلك ، كان من المثير للاهتمام فهم كيفية عمل هذه الخوارزميات - من فرز الفقاعة ، وفرز الإدراج ، ودمج الفرز ، وفرز الاختيار ، إلى الخوارزمية الأكثر تعقيدًا - الفرز السريع. لقد وجدت أنه نادرًا ما تكون هناك حاجة لتطبيق مثل هذه الخوارزميات ، خاصة إذا لم تكن بحاجة إلى كتابة دالة فرز تشكل جزءًا من مكتبة.
ومع ذلك ، في Skype ، كان عليّ أن ألجأ إلى الاستخدام العملي لمعرفتي في فرز الخوارزميات. قرر أحد المبرمجين لدينا تنفيذ الفرز حسب الإدخالات لعرض جهات الاتصال. في عام 2013 ، عندما كان Skype متصلاً بالإنترنت ، تم تنزيل جهات الاتصال على دفعات. استغرق الأمر بعض الوقت لتنزيلها جميعًا. نتيجة لذلك ، اعتقد هذا المبرمج أنه سيكون من الأفضل إنشاء قائمة بجهات الاتصال مرتبة حسب الاسم باستخدام فرز الإدراج. لقد ناقشنا هذه الخوارزمية كثيرًا ، ونفكر في سبب عدم استخدام شيء تم تنفيذه بالفعل. نتيجة لذلك ، استغرقنا معظم الوقت لاختبار تنفيذ الخوارزمية بشكل صحيح والتحقق من أدائها. أنا شخصياً لم أجد فائدة كبيرة في إنشاء تطبيق خاص بي لهذه الخوارزمية. ولكن بعد ذلك كان المشروع في مثل هذه المرحلةحيث كان لدينا وقت لمثل هذه الأشياء.
بالطبع ، هناك مواقف حقيقية يلعب فيها الفرز الفعال دورًا مهمًا للغاية في المشروع. وإذا تمكن المطور بشكل مستقل ، بناءً على ميزات البيانات ، من اختيار الخوارزمية الأنسب ، فيمكن أن يؤدي ذلك إلى زيادة ملحوظة في أداء الحل. يمكن أن يكون فرز الإدراج مفيدًا جدًا حيث تعمل مع مجموعات بيانات كبيرة يتم إرسالها في مكان ما في الوقت الفعلي ، ويمكنك تصور هذه البيانات على الفور. يمكن أن تعمل ميزة Merge Sort بشكل جيد مع مناهج التقسيم والقهر عند التعامل مع كميات كبيرة من البيانات المخزنة في عقد مختلفة. لم أعمل مطلقًا مع مثل هذه الأنظمة ، لذا ما زلت في الوقت الحالي أعتبر تصنيف الخوارزميات كشيء محدود الاستخدام في العمل اليومي. انها حقيقة،لا يتعلق الأمر بأهمية فهم كيفية عمل خوارزميات الفرز المختلفة.
تجزئة الجداول والتجزئة: في كل مكان
هيكل البيانات الذي أستخدمه بانتظام هو جدول تجزئة. يتضمن هذا أيضًا وظائف التجزئة. هذه أداة مفيدة للغاية يمكن استخدامها لحل مجموعة متنوعة من المهام - من حساب عدد كيانات معينة ، واكتشاف التكرارات ، والتخزين المؤقت ، إلى سيناريوهات مثل التجزئة المستخدمة في الأنظمة الموزعة . تعد جداول التجزئة ، بعد المصفوفات ، أكثر هياكل البيانات شيوعًا في البرمجة. لقد استخدمته في مواقف لا حصر لها. إنه موجود في جميع لغات البرمجة تقريبًا ، وإذا لزم الأمر ، فمن السهل تنفيذه بنفسك.
الأكوام وقوائم الانتظار: من وقت لآخر
المكدس عبارة عن بنية بيانات مألوفة لأي شخص قام بتصحيح التعليمات البرمجية المكتوبة بلغة تدعم آثار المكدس. إذا تحدثنا عن المكدس باعتباره بنية بيانات ، فعندئذ ، أثناء العمل ، واجهت العديد من المشكلات التي كنت بحاجة إلى حل لها. ولكن تجدر الإشارة إلى أنني تعرفت على المكدسات بشكل صحيح أثناء تصحيح الأخطاء وتوصيف أداء الكود. تعد الحزم أيضًا خيارًا طبيعيًا لاستخدام بنية البيانات عند إجراء DFS.
نادرًا ما أضطر إلى اللجوء إلى استخدام قوائم الانتظار ، لكنني واجهتها كثيرًا في قواعد الرموز الخاصة بالمشاريع المختلفة. لنفترض أنه تم وضع شيء ما في قائمة الانتظار وتم استرداد شيء منه. عادةً ما يتم استخدام قوائم الانتظار لتنفيذ اجتياز الشجرة ذي العرض الأول ، وهي مثالية لهذه المهمة. يمكن استخدام قوائم الانتظار في العديد من المواقف الأخرى أيضًا. ذات يوم ، صادفت بعض رموز جدولة الوظائف التي وجدت فيها مثالًا للاستخدام اللائق لقائمة انتظار الأولوية التي تم تنفيذها بواسطة وحدة heapq Python ، عندما تم تنفيذ أقصر المهام أولاً.
خوارزميات التشفير: اوبر
يجب تشفير البيانات المهمة التي يدخلها المستخدمون في تطبيقات الأجهزة المحمولة أو تطبيقات الويب قبل إرسالها عبر الشبكة. ويقومون بفك تشفيرها فقط عند الحاجة إليها. من أجل تنظيم مخطط العمل هذا ، يجب أن يكون تنفيذ خوارزميات التشفير موجودًا على أجزاء العميل والخادم من التطبيقات.
إن فهم خوارزميات التشفير أمر مثير للغاية. في الوقت نفسه ، يجب ألا تقدم خوارزمياتك الخاصة لحل بعض المشكلات. هذه واحدة من أسوأ الأفكار التي يمكن للمبرمج التفكير فيها. بدلاً من ذلك ، فإنه يأخذ معيارًا موجودًا وموثقًا جيدًا ويستخدم العناصر الأولية المضمنة في الأطر المعنية. عادة ، تعمل AES كمعيار يتم اختياره عند تنفيذ حلول التشفير.... إنه آمن بما يكفي لاستخدامه لتشفير المعلومات السرية في الولايات المتحدة . لا توجد هجمات عمل معروفة على البروتوكول. عادة ما تكون AES-192 و AES-256 موثوقة تمامًا لمعظم المهام العملية.
عندما أتيت إلى Uber ، تم بالفعل تنفيذ نظام تشفير الهاتف ونظام التشفير لتطبيق الويب ، فقد استندوا إلى الآليات المذكورة أعلاه ، لذلك كان لدي سبب لدراسة التفاصيل حول AES (معيار التشفير المتقدم) ، حول HMAC (رموز مصادقة الرسائل المجزأة) حول خوارزمية RSA وأشياء أخرى من هذا القبيل. كان من المثير للاهتمام أيضًا فهم كيفية إثبات قوة التشفير لتسلسل الإجراءات المستخدمة في التشفير. على سبيل المثال ، إذا تحدثنا عن التشفير المصادق عليه بالبيانات المرفقة ، فقد اتضح أن تحليل أوضاع التشفير و MAC ، و MAC-encrypt-then-encrypt-then-MAC ، من الممكن إثبات قوة التشفير لواحد منها فقط ، على الرغم من أن هذا لا يعني ذلك البقية ليست آمنة من الناحية المشفرة
من غير المحتمل أن تحتاج أبدًا إلى تنفيذ أساسيات التشفير بنفسك ، إلا إذا كنت تقوم بتنفيذ إطار عمل تشفير جديد تمامًا. ولكن قد تواجه الحاجة إلى اتخاذ قرارات بشأن الأوليات التي يجب استخدامها وكيفية دمجها. قد تحتاج أيضًا إلى معرفة في مجال خوارزميات التشفير لفهم سبب استخدام نظام معين لنهج معين لتشفير البيانات.
أشجار القرار: أوبر
أثناء العمل في أحد المشاريع ، كان علينا تنفيذ منطق الأعمال المعقد في تطبيق الهاتف المحمول. وبالتحديد ، استنادًا إلى ستة قواعد ، يجب عرض واحدة من عدة شاشات. كانت هذه القواعد معقدة للغاية لأن نتائج تسلسل الاختبار وتفضيل المستخدم يجب أن يؤخذ في الاعتبار.
حاول المبرمج الذي بدأ في حل هذه المشكلة أولاً التعبير عن كل هذه القواعد في شكل عبارات if-else. نتج عن هذا رمز مربك للغاية. نتيجة لذلك ، تقرر استخدام شجرة القرار. بمساعدته ، كان من السهل إجراء جميع الفحوصات اللازمة. كان من السهل نسبيا تنفيذها. بالإضافة إلى ذلك ، إذا لزم الأمر ، يمكن تغييره دون مشاكل كبيرة. لقد احتجنا إلى إنشاء تطبيقنا الخاص لشجرة القرار ، بحيث يتم فحص الشروط على أطرافها. هذا كل ما نحتاجه من هذه الشجرة. بينما كان بإمكاننا توفير الوقت الذي نقضيه في تنفيذ الشجرة باتباع نهج مختلف ، قرر الفريق أن الشجرة المعينة ستكون أسهل في الصيانة ، وذهب للعمل. تبدو هذه الشجرة كما يلي:ترمز الحواف إلى نتائج التحقق من الشروط (هذه نتائج ثنائية ، أو النتائج ممثلة بنطاقات من القيم) ، وتصف العقد الطرفية للشجرة الشاشات التي تحتاج إلى التنقل إليها.

, , .
استخدم نظام الإنشاء لتطبيق Uber للجوّال ، المسمى SubmitQueue ، شجرة قرارات ، ولكن تم إنشاؤه ديناميكيًا. كان على فريق Developer Experience معالجة المشكلة الصعبة المتمثلة في إجراء دمج يومي لمئات من الفروع المصدر مع الفرع المستهدف. في نفس الوقت ، استغرقت كل مجموعة حوالي 30 دقيقة لإكمالها. وشمل ذلك تجميع وتشغيل اختبارات الوحدة والتكامل واختبارات الواجهة. لم تكن التجميعات الموازية حلاً جيدًا بما فيه الكفاية ، حيث كانت هناك غالبًا تغييرات متداخلة في التجميعات المختلفة ، مما تسبب في حدوث تعارضات في الدمج. من الناحية العملية ، كان هذا يعني أنه في بعض الأحيان كان على المبرمجين الانتظار 2-3 ساعات ، واللجوء إلى تغيير الأساس ، وإعادة عملية الدمج مرة أخرى ، على أمل ألا يواجهوا هذه المرة أي تعارض.
اتخذ فريق Developer Experience منهجًا مبتكرًا للتنبؤ بتعارضات الدمج وتجميعات قائمة الانتظار وفقًا لذلك. تم ذلك باستخدام شجرة قرارات ثنائية خاصة (شجرة المضاربة).

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

تقسيم الخريطة إلى خلايا سداسية.
هيكل البيانات هذا له نظام فهرسة خاص به ، واجتياز ، وتعريفات خاصة به للمناطق الفردية من الشبكة ، ووظائفه الخاصة. يمكن العثور على وصف مفصل لكل هذا في وثائق API المقابلة. اقرأ المزيد عن H3 هنا . هنا هو الكود المصدري هنا يمكنك العثور على قصة حول كيفية إنشاء هذا النظام ولماذا.
سمحت لي التجربة مع هذا النظام بالشعور بأن إنشاء هياكل البيانات المتخصصة الخاصة بك يمكن أن يكون منطقيًا عند حل مشكلات محددة للغاية. هناك عدد قليل جدًا من المشكلات في الحل التي يمكنك من خلالها تطبيق شبكة سداسية ، إذا لم تأخذ في الاعتبار التقسيم إلى أجزاء خريطة مع مقارنة مع كل جزء بيانات ناتج من مستويات مختلفة. ولكن ، كما هو الحال في حالات أخرى ، إذا كنت معتادًا على هياكل البيانات الأخرى ، فسيكون فهم ذلك أسهل بكثير. وبالنسبة إلى الشخص الذي تعامل مع شبكة سداسية ، سيكون من الأسهل إنشاء بنية بيانات جديدة مصممة لحل المشكلات المشابهة لتلك التي يتم حلها باستخدام مثل هذه الشبكة.
هياكل البيانات والخوارزميات في المقابلات
أعلاه ، تحدثت عن هياكل البيانات والخوارزميات التي واجهتها أثناء العمل في شركات مختلفة لفترة طويلة. أقترح الآن العودة إلى تلك التغريدة التي كتبها ماكس هويل ، والتي ذكرتها في بداية المقال. هناك ، اشتكى ماكس من أنه في مقابلة مع Google طُلب منه قلب شجرة ثنائية على لوح. لم يفعل. تم عرض الباب. في هذه الحالة ، أنا في صف ماكس.
أعتقد أن معرفة كيفية عمل الخوارزميات الشائعة ، أو كيفية عمل هياكل البيانات الغريبة ، ليس نوع المعرفة الذي تحتاجه للعمل في شركة تقنية. تحتاج إلى معرفة ما هي الخوارزمية ، يجب أن تكون قادرًا على ابتكار خوارزميات بسيطة بشكل مستقل ، على سبيل المثال ، العمل وفقًا لمبدأ "الجشع". تحتاج أيضًا إلى معرفة هياكل البيانات الأكثر شيوعًا مثل جداول التجزئة وقوائم الانتظار والمكدسات. لكن شيئًا محددًا تمامًا ، مثل خوارزمية Dijkstra أو A * ، أو شيء أكثر تعقيدًا ، ليس شيئًا يجب تعلمه عن ظهر قلب. إذا كنت حقًا بحاجة إلى هذه الخوارزميات ، فيمكنك بسهولة العثور على مواد مرجعية عليها. على سبيل المثال ، إذا تحدثنا عن الخوارزميات التي لا تتعلق بخوارزميات الفرز ، فعادة ما أحاول فهمها بشكل عام وفهم جوهرها.الشيء نفسه ينطبق على هياكل البيانات الغريبة مثل الأشجار ذات اللون الأحمر والأسود وأشجار AVL. لم يكن لدي حاجة لاستخدامها. وإذا كنت في حاجة إليها ، يمكنني دائمًا تحديث معرفتي بها من خلال اللجوء إلى المنشورات المناسبة. عند إجراء المقابلات ، كما قلت ، لا أطرح مثل هذه الأسئلة ، ولا أخطط لطرحها.
أنا أؤيد المشاكل العملية المتعلقة بالبرمجة ، في حلها يمكنك تطبيق مجموعة متنوعة من الأساليب: من أساليب "القوة الغاشمة" ومتغيرات "الجشع" للخوارزميات إلى أفكار خوارزمية أكثر تقدمًا. على سبيل المثال ، أعتقد أنه من الجيد تمامًا أن يكون لديك مهمة محاذاة نص مثل هذه . على سبيل المثال ، كان علي حل هذه المشكلة عند إنشاء مكون لعرض النص على Windows Phone. يمكنك حل هذه المشكلة ببساطة عن طريق استخدام مصفوفة وبعض عبارات if-else ، دون اللجوء إلى بعض هياكل البيانات الصعبة.
في الواقع ، يبالغ العديد من الفرق والشركات في أهمية المشكلات الخوارزمية. أنا أفهم جاذبية أسئلة الخوارزمية. إنها تسمح لك بتقييم مقدم الطلب في وقت قصير ، ومن السهل إعادة الأسئلة ، مما يعني أنه إذا أصبحت الأسئلة التي تم طرحها على شخص ما عامة ، فلن تسبب أي مشاكل خاصة. تعتبر أسئلة الخوارزمية جيدة لتنظيم التجارب لعدد كبير من المتقدمين. على سبيل المثال ، يمكنك إنشاء مجموعة تضم أكثر من مائة سؤال وتوزيعها بشكل عشوائي على المتقدمين. أصبحت الأسئلة المتعلقة بالبرمجة الديناميكية وهياكل البيانات الغريبة أكثر شيوعًا. خاصة في وادي السيليكون. يمكن أن تساعد هذه الأسئلة الشركات في توظيف مبرمجين أقوياء. ولكن هذه الأسئلة نفسها يمكن أن تسد الطريق في الشركة أمام هؤلاء الأشخاص الذين نجحوا في العمل ،حيث لا تكون هناك حاجة إلى معرفة عميقة بالخوارزميات.
إذا كنت من شركة لا توظف إلا الأشخاص الذين لديهم معرفة عميقة بالخوارزميات المعقدة منذ الولادة تقريبًا ، أقترح أن تفكر مليًا فيما إذا كان هؤلاء هم الأشخاص الذين تحتاجهم. على سبيل المثال ، قمت بتعيين فرق رائعة في Skyscanner (لندن) و Uber (أمستردام) دون طرح أسئلة خوارزمية صعبة. لقد اقتصرت على هياكل البيانات الأكثر شيوعًا ولاختبار قدرات الأشخاص الذين تمت مقابلتهم فيما يتعلق بحل المشكلات. أي أنهم كانوا بحاجة إلى معرفة هياكل البيانات الشائعة والقدرة على ابتكار خوارزميات بسيطة لحل المشكلات التي يواجهونها. هياكل البيانات والخوارزميات هي مجرد أدوات.
خلاصة القول: هياكل البيانات والخوارزميات هي أدوات
إذا كنت تعمل في شركة تكنولوجيا ديناميكية ومبتكرة ، فمن المحتمل أن تواجه تطبيقات لمجموعة متنوعة من هياكل البيانات والخوارزميات في كود منتجات هذه الشركة. إذا كنت تطور شيئًا جديدًا تمامًا ، فغالبًا ما يتعين عليك البحث عن هياكل البيانات التي تسهل حل المشكلات التي تواجهها. في مثل هذه المواقف ، تحتاج إلى معرفة عامة بالخوارزميات وهياكل البيانات ومزاياها وعيوبها لاتخاذ القرار الصحيح.
هياكل البيانات والخوارزميات هي أدوات يجب عليك استخدامها بثقة عند كتابة البرامج. عندما تعرف هذه الأدوات ، سترى الكثير مما تعرفه بالفعل في قواعد الرموز التي تستخدمها. بالإضافة إلى ذلك ، ستتيح لك هذه المعرفة حل المشكلات المعقدة بثقة أكبر. ستكون على دراية بالقيود النظرية للخوارزميات وكيف يمكن تحسينها. سيساعدك هذا في النهاية على الوصول إلى حل ، مع كل المقايضات الضرورية ، يتضح أنه جيد قدر الإمكان.
إذا كنت ترغب في الحصول على فهم أفضل لهياكل البيانات والخوارزميات ، فإليك بعض النصائح والموارد:
- -, , , , , , . , , . , . — , .
- « ». , , , . — , , . , , , .
- إليك بضعة كتب أخرى: " الخوارزميات. دليل التطوير "و" الخوارزميات في جافا الإصدار الرابع ". استخدمتها لتحديث معرفتي الجامعية بالخوارزميات. صحيح ، أنا لم أقرأها حتى النهاية. بدت لي جافة نوعًا ما وغير قابلة للتطبيق على عملي اليومي.
ما هي هياكل البيانات والخوارزميات التي واجهتها في الممارسة؟
