كيف تحل خوارزمية؟ | مع الأمثلة

developer team coding javascript

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

قائمة المحتويات:

[365 Toy Project: 022/365] Batman: Scarlet Part 4 - Solve the problem - Solve an Algorithm.

مقدمة

ما هي الخوارزمية؟

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

Computer geometric digital connection structure. Business inteligence technology background. Wirefra

كيف تحل الخوارزمية؟

سنستعرض بعض الخطوات لحل مشكلة خوارزمية خاصة.

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

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

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

ما هي الخطوات الأربع لحل المشكلات باستخدام الخوارزميات؟ والمثال رقم 1

الآن بعد أن عرفت ما هي الخوارزمية ، دعنا ننتقل إلى بعض الأمثلة ونلقي نظرة على كيفية وضع هذه التقنيات موضع التنفيذ ...

في التالي سوف نستخدم التحدي من leetcode number #387:

١) افهم المشكلة

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

الهدف من هذا التحدي هو كتابة دالة يأخذ سلسلة ويعيد فهرس الحرف الأول في السلسلة التي لا تتكرر. على سبيل المثال ، إذا كانت السلسلة "nerd" ، الدالة يجب عليها إرجاع 0 ، لأن الحرف الأول "n" هو أول حرف غير مكرر في السلسلة. إذا كانت السلسلة "abcdefg" ، يجب أن تُرجع الدالة 0 ، لأن الحرف الأول "a" هو الحرف الأول غير المكرر في السلسلة.

إذا كانت السلسلة لا تحتوي على أي أحرف غير مكررة ، يجب أن ترجع الدالة -1. على سبيل المثال ، إذا كانت سلسلة الإدخال هي "abcabc" ، يجب أن ترجع الدالة -1 ، لأنه لا يوجد حرف في السلسلة فريد أو غير مكرر.

٢) جزء المشكلة

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

لحل هذا التحدي علينا القيام بما يلي:

  1. كرر على الأحرف في سلسلة الإدخال ، ولكل حرف ، تتبع عدد المرات التي يظهر فيها في السلسلة. يمكننا القيام بذلك باستخدام كائن أو قاموس أو خريطة ، حيث تكون المفاتيح هي الأحرف الموجودة في السلسلة ، والقيم هي عدد كل حرف.
  2. بمجرد أن نحسب تكرارات كل حرف في السلسلة ، نحتاج إلى إيجاد فهرس الحرف الأول الذي يحتوي على عدد 1 (أي الحرف الأول غير المكرر). للقيام بذلك ، يمكننا تكرار الأحرف الموجودة في السلسلة مرة أخرى ، ولكل حرف ، تحقق مما إذا كان عدده في الكائن / القاموس هو 1. إذا كان كذلك ، فإننا نعيد فهرس الحرف.
  3. إذا وصلنا إلى نهاية الحلقة دون العثور على أي قيمة تحتوي على حرف واحد فقط أو حرف غير مكرر ، فإننا نرجع -1 للإشارة إلى عدم وجود أحرف غير مكررة.

٣) ابحث عن الحل المناسب لك

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

سنعرض الحل بلغتي برمجة JavaScript و Python:

الكود في جافاسكريبت:

function firstNonRepeatingChar(s) {
  // Store the counts of each character in a dictionary
  const counts = {};
  for (const c of s) {
    if (c in counts) {
      counts[c] += 1;
    } else {
      counts[c] = 1;
    }
  }

  // Find the index of the first character with a count of 1
  for (let i = 0; i < s.length; i++) {
    const char = s[i];
    if (counts[char] === 1) {
      return i;
    }
  }

  // If no such character was found, return -1
  return -1;
}

فيما يلي بعض الأمثلة عن كيفية استخدام هذه الداله:

console.log(firstNonRepeatingChar("nerdlevel"))
// Returns 0, because the first character "n" is the first non-repeating character in the string

console.log(firstNonRepeatingChar("abcdefg"))
// Returns 0, because the first character "a" is the first non-repeating character in the string

console.log(firstNonRepeatingChar("abcabc"))
// Returns -1, because no character in the string is non-repeating

الكود في بايثون::

def first_non_repeating_char(s: str) -> int:
    # Store the counts of each character in a dictionary
    counts = {}
    for c in s:
        if c in counts:
            counts[c] += 1
        else:
            counts[c] = 1

    # Find the index of the first character with a count of 1
    for i, c in enumerate(s):
        if counts[c] == 1:
            return i

    # If no such character was found, return -1
    return -1

فيما يلي بعض الأمثلة عن كيفية استخدام هذه الداله:

print(first_non_repeating_char("nerdlevel"))
# Returns 0, because the first character "n" is the first non-repeating character in the string

print(first_non_repeating_char("abcdefg"))
# Returns 0, because the first character "a" is the first non-repeating character in the string

print(first_non_repeating_char("abcabc"))
# Returns -1, because no character in the string is non-repeating

print(first_non_repeating_char("Level"))
# Returns 0, because the first character "L" is the first non-repeating character in the string
# That's a problem because we all know the the letter L is l just different cases

٤) تحقق من الحل الخاص بك

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

كما ذكرنا أعلاه ، سألنا أنفسنا هذه الأسئلة ، لكن الخوارزمية التي كتبناها لم تستطع تجاوز جميع الحالات المختلفة بنجاح: على سبيل المثال ، لا يمكن للرمز التعامل مع الحالة عندما تعاملنا مع حالتين من نفس الحرف "L" و " ل "في كلمة" المستوى "

لذلك نحن بحاجة إلى معالجة ذلك في ما يلي:

دعنا الآن نعيد النظر في الكود الذي كتبناه ونرى ما إذا كان بإمكاننا التوصل إلى حل آخر يغطي جميع الحالات المختلفة للشخصية.

الكود في جافاسكريبت:


function firstNonRepeatingChar(s) {
  // Store the string after converting it into lowercase
  let newS = s.toLowerCase()
  
  // Store the counts of each character in a dictionary
  const counts = {};
  for (const char of newS) {
    if (char in counts) {
      counts[char] += 1;
    } else {
      counts[char] = 1;
    }
  }

  // Find the index of the first character with a count of 1
  for (let i = 0; i < s.length; i++) {
    const char = newS[i];
    if (counts[char] === 1) {
      return i;
    }
  }

  // If no such character was found, return -1
  return -1;
}

فيما يلي بعض الأمثلة عن كيفية استخدام هذه الداله:

console.log(firstNonRepeatingChar("Level"))
// Returns 2, because the character "e" is the first non-repeating character in the string

الكود في بايثون::

def first_non_repeating_char(s: str) -> int:
    # Store the string after converting it into lowercase
    newS = s.lower()
  
    # Store the counts of each character in a dictionary
    counts = {}
    for char in newS:
        if char in counts:
            counts[char] += 1
        else:
            counts[char] = 1

    # Find the index of the first character with a count of 1
    for index, char in enumerate(newS):
        if counts[char] == 1:
            return index

    # If no such character was found, return -1
    return -1

فيما يلي بعض الأمثلة عن كيفية استخدام هذه الداله:

print(first_non_repeating_char("Level"))
# Returns 0, because the character "e" is the first non-repeating character in the string

مثال ٢

الآن بعد أن تعلمت من المثال الأول ، دعنا ننتقل إلى تحدٍ آخر ونطبق نفس الأساليب التي استخدمناها أعلاه:

هذا المثال من leetcode problem #125 Valid Palindrome

١) افهم المشكلة

تعرف على أكبر قدر ممكن من المعلومات حول المشكلة ما هو Palindrome؟ اسأل نفسك ما هي المدخلات التي تتوقعها وما هو الإخراج المتوقع.

Palindrome هي كلمة أو عبارة أو جملة يتم تهجئتها إلى الوراء مثل الأمام. نتوقع سلسلة ويمكننا القيام بوظيفة تقوم أولاً بتنظيف تلك السلسلة من أي سلسلة غير أبجدية رقمية ، ثم عكسها ومقارنتها بالسلسلة الأصلية.

٢) جزء المشكلة

فيما يلي شرح تفصيلي للخوارزمية بلغة بسيطة:

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

فيما يلي مثال لكيفية عمل هذه الخوارزمية على السلسلة "رجل ، خطة ، قناة: بنما":

  1. يتم تحويل السلسلة إلى أحرف صغيرة ، بحيث تصبح "رجل ، مخطط ، قناة: بنما".
  2. تتم إزالة جميع الأحرف غير الأبجدية الرقمية ، وبالتالي تصبح السلسلة "amanaplanacanalpanama".
  3. يتم عكس السلسلة ، بحيث تصبح "amanaplanacanalpanama".
  4. تتم مقارنة السلسلة المعكوسة بالسلسلة الأصلية ، وبما أنهما متماثلان ، فإن الدالة ترجع صحيحًا ، مما يشير إلى أن السلسلة الأصلية متطابقة.

٣) ابحث عن الحل المناسب لك

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

الكود في جافاسكريبت:

function isPalindrome(s) {
  // Convert all uppercase letters to lowercase
  s = s.toLowerCase();

  // Remove all non-alphanumeric characters
  s = s.replace(/[^a-z0-9]/g, "");

  // Reverse the string
  let reversed = s.split("").reverse().join("");

  // Compare the reversed string with the original
  return s == reversed;
}

فيما يلي بعض الأمثلة عن كيفية استخدام هذه الداله:

console.log(isPalindrome("A man, a plan, a canal: Panama")) // returns true
console.log(isPalindrome("race a car") )// returns false
console.log(isPalindrome("Never odd or even")) // returns true

الكود في بايثون:

def is_palindrome(s):
  # Convert all uppercase letters to lowercase and remove the spaces
  s = s.lower().replace(" ", "")

  # Create a translation table that maps non-alphanumeric characters to None
  trans_table = str.maketrans("", "", "'!#$%&\'()*+,-./:;<=>?@[\]^_`{|}~'")
  
  # Apply trans_table to remove non-alphanumeric characters
  s = s.translate(trans_table)
  
  # Reverse the string
  reversed = s[::-1]

  # Compare the reversed string with the original
  return s == reversed

فيما يلي بعض الأمثلة عن كيفية استخدام هذه الداله:

print(is_palindrome("A man, a plan, a canal: Panama")) # returns True
print(is_palindrome("race a car")) # returns False
print(is_palindrome("Never odd or even")) # returns True

٤) تحقق من الحل الخاص بك

يمكننا جعله أكثر كفاءة باستخدام طريقة المؤشرات دعنا نقسمها إلى بضع نقاط أدناه:

  1. إنشاء مؤشرات على اليسار واليمين (سيتم تمثيلها بواسطة المؤشرات)
  2. اجعل كل مؤشر يتحرك إلى الاتجاه الأوسط
  3. أثناء الانتقال للتحقق من كل حرف ، فإن كلا المؤشرين متماثلين

الكود في جافاسكريبت:

function isPalindrome(s) {
  // Convert all uppercase letters to lowercase & Remove all non-alphanumeric characters
  s = s.toLowerCase().replace(/[^a-z0-9]/g, "");

  // Creating the two pointers the left at beginning, right at the end.
  let left = 0
  let right = s.length -1

  while (left < right) {
    // Check if pointers having same values 
    if (s[left] != s[right]) return false

    // Move left pointer forward  
    left += 1

    // Move left pointer backword  
    right -= 1
  }
  return true
}

الكود في بايثون:

def is_palindrome(s):
  # Cleaning the string from all non-alphanumeric
  s = ''.join(filter(str.isalnum, s)).lower()

  # Creating the two pointers the left at beginning, right at the end.
  left = 0
  right = len(s) -1
  
  while left < right:
    # Check if pointers having same values 
    if s[left] != s[right]:
      return False
    
      # Move left pointer forward  
    left = left + 1
    
    # Move left pointer backword
    right = right -1
    
  return True
Quantum computer technology concept. Deep learning artificial intelligence. Big data algorithms visu

 

الخلاصة والمراجع

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

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

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

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

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

https://ahmedradwan.dev

Reach out if you want to join me and write articles with the nerds 🙂


اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *