freeCodeCamp/guide/arabic/computer-science/dynamic-programming/index.md

2.3 KiB

title localeTitle
Dynamic Programming برمجة ديناميكية

برمجة ديناميكية

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

مثال على سلسلة فيبوناتشي التي تم تعريفها على النحو التالي:

F(N) = F(N-1) + F(N-2)

هذه هي الشجرة للعثور على F (5):

شجرة فيبوناتشي سيري

لحساب F (5) ستحتاج إلى حساب عدة مرات نفس F (i). استخدام العودية:

def fib(n) { if n <= 1: return n return fib(n-1) + fib(n-2); }

وفيما يلي الحل الأمثل (باستخدام DP)

بالنسبة إلى F (5) ، سيؤدي هذا الحل إلى إنشاء المكالمات الواردة في الصورة أعلاه ، والتي تعمل في O (2 ^ N).

هنا هو الحل الأمثل الذي يستخدم DP و memoization:

`lookup = {1 : 1, 2 : 1} # Create a lookup-table (a map) inizialized with the first 2 Fibonacci's numbers

def fib(n) { if n in lookup: # If n is already computed return n # Return the previous computed solution else lookup[n] = fib(n-1) + fib(n-2) # Else, do the recursion. return lookup[n] } `

التخزين المؤقت للحلول المحسوبة في جدول البحث ، والاستعلام عنها قبل الذهاب العودية سيتيح للبرنامج وقت تشغيل O (N).

معلومات اكثر:

ما هي البرمجة الديناميكية على StackOverflow الفرق بين memoization و DP على StackOverflow