fix: converted single to triple backticks5 (#36232)
This commit is contained in:
@@ -8,33 +8,35 @@ localeTitle: قواميس
|
||||
|
||||
إليك القائمة التي سنعمل معها:
|
||||
|
||||
`ice_cream = ["strawberry",
|
||||
"vanilla",
|
||||
"vanilla",
|
||||
"chocolate",
|
||||
"chocolate",
|
||||
"chocolate",
|
||||
"banana",
|
||||
"rum raisin",
|
||||
"banana"]
|
||||
`
|
||||
```python
|
||||
ice_cream = ["strawberry",
|
||||
"vanilla",
|
||||
"vanilla",
|
||||
"chocolate",
|
||||
"chocolate",
|
||||
"chocolate",
|
||||
"banana",
|
||||
"rum raisin",
|
||||
"banana"]
|
||||
```
|
||||
|
||||
يعطي هذا الرمز ، الذي يستخدم متداخلاً لحلقات ، الإجابة الصحيحة ، وتخزين الإجابة في قائمة "العد":
|
||||
|
||||
`count = []
|
||||
for flavor in ice_cream:
|
||||
found = False
|
||||
for entry in count:
|
||||
if entry[0] == flavor:
|
||||
entry[1] += 1
|
||||
found = True
|
||||
if not found:
|
||||
count.append([flavor, 1])
|
||||
|
||||
# Print.
|
||||
for (entry, total) in count:
|
||||
print (entry, total)
|
||||
`
|
||||
```python
|
||||
count = []
|
||||
for flavor in ice_cream:
|
||||
found = False
|
||||
for entry in count:
|
||||
if entry[0] == flavor:
|
||||
entry[1] += 1
|
||||
found = True
|
||||
if not found:
|
||||
count.append([flavor, 1])
|
||||
|
||||
# Print.
|
||||
for (entry, total) in count:
|
||||
print (entry, total)
|
||||
```
|
||||
|
||||
على الرغم من أن هذا الرمز يعطي الإجابة الصحيحة ، إلا أنه يوجد شيئان خاطئان به. أولاً ، إنها معقدة. كلما زاد عدد الحلقات المتداخلة التي يحتوي عليها البرنامج ، كلما كان من الصعب فهمها وإصلاحها وتوسيعها. علاوة على ذلك ، فهو غير فعال. قد لا يكون هذا مشكلة في هذا المثال الصغير ، ولكن تخيل قائمة تحتوي على آلاف أو ملايين العناصر. إن مسح قائمة الإدخالات في كل مرة نقوم فيها بملاحظة تستغرق وقتًا طويلاً للغاية ، بغض النظر عن سرعة الكمبيوتر. هذا موضوع تم تناوله بشكل كامل عند دراسة موضوعات مثل التدوين الكبير O ومقارنة خوارزميات البحث والفرز.
|
||||
|
||||
@@ -44,65 +46,70 @@ localeTitle: قواميس
|
||||
|
||||
فيما يلي بعض أمثلة التعليمات البرمجية:
|
||||
|
||||
`ice_cream = {'chocolate' : 3, 'strawberry' : 1}
|
||||
print (ice_cream)
|
||||
>> {'chocolate' : 3, 'strawberry' : 1}
|
||||
print (ice_cream['strawberry'])
|
||||
>> 1
|
||||
`
|
||||
```python
|
||||
ice_cream = {'chocolate' : 3, 'strawberry' : 1}
|
||||
print (ice_cream)
|
||||
>> {'chocolate' : 3, 'strawberry' : 1}
|
||||
print (ice_cream['strawberry'])
|
||||
>> 1
|
||||
```
|
||||
|
||||
لاختبار ما إذا كان المفتاح موجودًا في أحد القواميس ، استخدم k في d:
|
||||
|
||||
`ice_cream = {'chocolate' : 3, 'strawberry' : 1}
|
||||
if 'chocolate' in ice_cream:
|
||||
print ('chocolate is in the list')
|
||||
...
|
||||
|
||||
del ice_cream['chocolate']
|
||||
if 'chocolate' in ice_cream:
|
||||
print ('oops: why is chocolate still there?')
|
||||
`
|
||||
```python
|
||||
ice_cream = {'chocolate' : 3, 'strawberry' : 1}
|
||||
if 'chocolate' in ice_cream:
|
||||
print ('chocolate is in the list')
|
||||
...
|
||||
|
||||
del ice_cream['chocolate']
|
||||
if 'chocolate' in ice_cream:
|
||||
print ('oops: why is chocolate still there?')
|
||||
```
|
||||
|
||||
**تحديث والعضوية** لتحديث القواميس ، ما عليك سوى تعيين قيمة للمفتاح. إذا كان المفتاح موجودًا بالفعل في القاموس ، فسيؤدي ذلك إلى تغيير القيمة المرتبطة به.
|
||||
|
||||
إذا لم يكن المفتاح موجودًا ، فيتم إضافته بالإضافة إلى القيمة:
|
||||
|
||||
`ice_cream = {}
|
||||
ice_cream['chocolate'] = 33
|
||||
ice_cream['vanilla'] = 999 # oops
|
||||
print (ice_cream)
|
||||
>> {'chocolate' : 33, vanilla' : 999}
|
||||
ice_cream['vanilla'] = 9
|
||||
print (ice_cream)
|
||||
>> {'chocolate' : 33, vanilla' : 9}
|
||||
`
|
||||
```python
|
||||
ice_cream = {}
|
||||
ice_cream['chocolate'] = 33
|
||||
ice_cream['vanilla'] = 999 # oops
|
||||
print (ice_cream)
|
||||
>> {'chocolate' : 33, vanilla' : 999}
|
||||
ice_cream['vanilla'] = 9
|
||||
print (ice_cream)
|
||||
>> {'chocolate' : 33, vanilla' : 9}
|
||||
```
|
||||
|
||||
استخدم _del d \[k\]_ ، لإزالة إدخال من قاموس ، حيث _d_ هو اسم القاموس و _k_ هو المفتاح الذي يتم إزالته. يمكن إزالة الإدخالات الموجودة فقط؛ محاولة إزالة واحدة غير موجودة يسبب خطأ:
|
||||
|
||||
`ice_cream = {'chocolate' : 33, vanilla' : 9}
|
||||
del ice_cream['chocolate']
|
||||
print (ice_cream)
|
||||
>> {'vanilla' : 9}
|
||||
del ice_cream['strawberry']
|
||||
>> Traceback (most recent call last):
|
||||
File "<stdin>", line 5, in <module>
|
||||
KeyError: 'strawberry'
|
||||
`
|
||||
```python
|
||||
ice_cream = {'chocolate' : 33, vanilla' : 9}
|
||||
del ice_cream['chocolate']
|
||||
print (ice_cream)
|
||||
>> {'vanilla' : 9}
|
||||
del ice_cream['strawberry']
|
||||
>> Traceback (most recent call last):
|
||||
File "<stdin>", line 5, in <module>
|
||||
KeyError: 'strawberry'
|
||||
```
|
||||
|
||||
**الحلقات** بما أن القواميس عبارة عن مجموعات (جنباً إلى جنب مع القوائم ، والصفوف ، والمجموعات) ، فإننا سنرغب في تكرار حلقاتها محتويات. نقوم بذلك من خلال حلقة for ، والتي تقوم بتعيين كل من المفاتيح في القاموس إلى متغير الحلقة بدوره:
|
||||
|
||||
`ice_cream = {'chocolate' : 183,
|
||||
'vanilla' : 71,
|
||||
'strawberry' : 63,
|
||||
'banana', 1}
|
||||
for flavor in ice_cream:
|
||||
print (flavor, ice_cream[flavor])
|
||||
|
||||
>> 'banana' 1
|
||||
'vanilla' 71
|
||||
'chocolate' 183
|
||||
'strawberry' 63
|
||||
`
|
||||
```python
|
||||
ice_cream = {'chocolate' : 183,
|
||||
'vanilla' : 71,
|
||||
'strawberry' : 63,
|
||||
'banana', 1}
|
||||
for flavor in ice_cream:
|
||||
print (flavor, ice_cream[flavor])
|
||||
|
||||
>> 'banana' 1
|
||||
'vanilla' 71
|
||||
'chocolate' 183
|
||||
'strawberry' 63
|
||||
```
|
||||
|
||||
كما هو الحال مع العناصر المحددة ، تقوم بايثون بتكرار أكثر من الإدخالات في القاموس بترتيب عشوائي. ليس هناك ما يضمن أن ينظر إليها أبجديا أو بالترتيب ، تم إضافتها إلى القاموس. لاحظ ، بالمناسبة ، أن التكرار فوق القواميس يختلف قليلاً عن التكرار على القوائم. عندما تقوم بايثون بتكرار أكثر من قائمة ، يتم تعيين القيم في القائمة للمتغير المتكرر. عندما تقوم الحلقات عبر قاموس ، من ناحية أخرى ، فإنه يعيّن المفاتيح. اختار مصممو بيثون القيام بذلك بسبب:
|
||||
|
||||
@@ -124,48 +131,50 @@ localeTitle: قواميس
|
||||
|
||||
لنعد إلى المثال الأصلي - كيف نحسب عدد العناصر في قائمة ice\_cream باستخدام القاموس؟
|
||||
|
||||
`# Count all the flavors.
|
||||
ice_cream = ["strawberry",
|
||||
"vanilla",
|
||||
"vanilla",
|
||||
"chocolate",
|
||||
"chocolate",
|
||||
"chocolate",
|
||||
"banana",
|
||||
"rum raisin",
|
||||
"banana"]
|
||||
|
||||
count = {}
|
||||
for flavor in ice_cream:
|
||||
if flavor in count:
|
||||
count[flavor] = count[flavor] + 1
|
||||
else:
|
||||
count[flavor] = 1
|
||||
|
||||
# Print.
|
||||
for b in count:
|
||||
print (b, count[b])
|
||||
`
|
||||
```python
|
||||
# Count all the flavors.
|
||||
ice_cream = ["strawberry",
|
||||
"vanilla",
|
||||
"vanilla",
|
||||
"chocolate",
|
||||
"chocolate",
|
||||
"chocolate",
|
||||
"banana",
|
||||
"rum raisin",
|
||||
"banana"]
|
||||
|
||||
count = {}
|
||||
for flavor in ice_cream:
|
||||
if flavor in count:
|
||||
count[flavor] = count[flavor] + 1
|
||||
else:
|
||||
count[flavor] = 1
|
||||
|
||||
# Print.
|
||||
for b in count:
|
||||
print (b, count[b])
|
||||
```
|
||||
|
||||
للقيام بذلك ، نقوم بإنشاء قاموس فارغ في البداية. في كل مرة يتم فيها التكرار عبر قائمة ice\_cream ، نتحقق من ذلك لمعرفة ما إذا كانت النكهة موجودة بالفعل في قاموس العدد. إذا كان كذلك ، نضيف واحدة إلى حسابها. إذا لم يكن الأمر كذلك ، فسنضيف الاسم إلى القاموس ذي القيمة 1.
|
||||
|
||||
يمكننا اختصار هذا البرنامج قليلا باستخدام الطريقة _dict.get ()_ . هذا يعيد إما القيمة المرتبطة بمفتاح أو بعض القيمة الافتراضية التي نقدمها. في هذه الحالة ، نحصل إما على عدد المرات التي رأينا فيها بالفعل نكهة أو صفر ، أضف واحدًا إلى أي قيمة ترجعها الطريقة ، وتخزينها مرة أخرى في القاموس:
|
||||
|
||||
`# Count all the flavors.
|
||||
count = {}
|
||||
for flavor in ice_cream:
|
||||
count[flavor] = count.get(flavor, 0) + 1
|
||||
|
||||
# Print.
|
||||
keys = count.keys()
|
||||
keys.sort()
|
||||
for b in keys:
|
||||
print (b, count[b])
|
||||
|
||||
# Print.
|
||||
for key in sorted(count):
|
||||
print (key, count[key])
|
||||
`
|
||||
```python
|
||||
# Count all the flavors.
|
||||
count = {}
|
||||
for flavor in ice_cream:
|
||||
count[flavor] = count.get(flavor, 0) + 1
|
||||
|
||||
# Print.
|
||||
keys = count.keys()
|
||||
keys.sort()
|
||||
for b in keys:
|
||||
print (b, count[b])
|
||||
|
||||
# Print.
|
||||
for key in sorted(count):
|
||||
print (key, count[key])
|
||||
```
|
||||
|
||||
لاحظ أننا نستخدم طريقتين منفصلتين لطباعة المفتاح والقيمة: يستخدم أحدهما طريقة التصنيف في Python ، والآخر لا يفعل ذلك.
|
||||
|
||||
|
@@ -23,22 +23,23 @@ localeTitle: الرسوم البيانية
|
||||
|
||||
مثال: رسم بياني يحتوي على عُقد في بلدان الشمال الأوروبي ، وباعتباره (غير موجه) يحرك مسافة القيادة إلى المدن المتصلة بالطريق المباشر.
|
||||
|
||||
`. +---------+
|
||||
. |Reykjavik|
|
||||
. +---------+
|
||||
.
|
||||
.
|
||||
. 529 km +---------+ 1760 km +--------+
|
||||
. +------------+|Stockholm|+---------+|Helsinki|
|
||||
. | +---------+ +--------+
|
||||
. + +
|
||||
. +----+ 1991 km |
|
||||
. |Oslo|+-------------------------------------+
|
||||
. +----+
|
||||
. +----------+
|
||||
. |Copenhagen|
|
||||
. +----------+
|
||||
`
|
||||
```
|
||||
. +---------+
|
||||
. |Reykjavik|
|
||||
. +---------+
|
||||
.
|
||||
.
|
||||
. 529 km +---------+ 1760 km +--------+
|
||||
. +------------+|Stockholm|+---------+|Helsinki|
|
||||
. | +---------+ +--------+
|
||||
. + +
|
||||
. +----+ 1991 km |
|
||||
. |Oslo|+-------------------------------------+
|
||||
. +----+
|
||||
. +----------+
|
||||
. |Copenhagen|
|
||||
. +----------+
|
||||
```
|
||||
|
||||
#### معلومات اكثر:
|
||||
|
||||
|
@@ -18,21 +18,24 @@ localeTitle: جداول تجزئة
|
||||
|
||||
تتمثل فكرة التجزئة في توزيع المدخلات (أزواج المفاتيح / القيم) عبر مجموعة من المجموعات. عند الحصول على مفتاح ، تقوم الخوارزمية بحساب فهرس يشير إلى المكان الذي يمكن العثور فيه على الإدخال:
|
||||
|
||||
`index = f(key, array_size)
|
||||
`
|
||||
```
|
||||
index = f(key, array_size)
|
||||
```
|
||||
|
||||
يتم ذلك غالبًا في خطوتين:
|
||||
|
||||
`hash = hashfunc(key)
|
||||
index = hash % array_size
|
||||
`
|
||||
```
|
||||
hash = hashfunc(key)
|
||||
index = hash % array_size
|
||||
```
|
||||
|
||||
في هذه الطريقة ، يكون التجزئة مستقلاً عن حجم الصفيف ، ثم يتم تخفيضه إلى فهرس (رقم بين 0 و array\_size - 1) باستخدام مشغل modulo (٪).
|
||||
|
||||
دعنا نفكر في السلسلة S. أنت مطالب بحساب معدل تكرار جميع الأحرف في هذه السلسلة.
|
||||
|
||||
`string S = “ababcd”
|
||||
`
|
||||
```
|
||||
string S = “ababcd”
|
||||
```
|
||||
|
||||
إن أبسط طريقة للقيام بذلك هي التكرار على جميع الأحرف الممكنة وحساب ترددها واحدة تلو الأخرى. وقت تعقيد هذا الأسلوب هو O (26 \* N) حيث N هو حجم السلسلة ويوجد 26 حرفًا محتملًا.
|
||||
|
||||
@@ -51,15 +54,16 @@ localeTitle: جداول تجزئة
|
||||
|
||||
انتاج |
|
||||
|
||||
`a 2
|
||||
b 2
|
||||
c 1
|
||||
d 1
|
||||
e 0
|
||||
f 0
|
||||
…
|
||||
z 0
|
||||
`
|
||||
```
|
||||
a 2
|
||||
b 2
|
||||
c 1
|
||||
d 1
|
||||
e 0
|
||||
f 0
|
||||
…
|
||||
z 0
|
||||
```
|
||||
|
||||
دعونا نطبق التجزئة على هذه المشكلة. خذ تردد صفيف من حجم 26 و تجزئة الأحرف 26 مع مؤشرات الصفيف باستخدام دالة التجزئة. ثم ، التكرار فوق السلسلة وزيادة القيمة في التردد في الفهرس المقابل لكل حرف. تعقيد هذا الأسلوب هو O (N) حيث N هو حجم السلسلة.
|
||||
|
||||
@@ -84,15 +88,16 @@ localeTitle: جداول تجزئة
|
||||
|
||||
انتاج |
|
||||
|
||||
`a 2
|
||||
b 2
|
||||
c 1
|
||||
d 1
|
||||
e 0
|
||||
f 0
|
||||
…
|
||||
z 0
|
||||
`
|
||||
```
|
||||
a 2
|
||||
b 2
|
||||
c 1
|
||||
d 1
|
||||
e 0
|
||||
f 0
|
||||
…
|
||||
z 0
|
||||
```
|
||||
|
||||
### تصادم تجزئة
|
||||
|
||||
|
@@ -22,18 +22,19 @@ localeTitle: القوائم المرتبطة
|
||||
|
||||
\`\` \` ثابت = حجم ثابت في وقت الإنشاء خطي = مخزن خطيًا في الذاكرة ككتلة واحدة
|
||||
|
||||
`#### Arrays have the following disadvantages:-
|
||||
1. Arrays are static structures and therefore cannot be easily extended or reduced to fit the data set.
|
||||
2. Arrays are also expensive to maintain new insertions and deletions.
|
||||
|
||||
Linked Lists address some of the limitations of arrays. Unlike an array, where all the elements are stored in a contiguous block of memory, in a linked list each element is a separate object and has a **link** to the next element in sequence. This allows a linked list to start with space for only one element, and grow to accomodate an arbitrary number of elements by allocating memory as and when needed.
|
||||
|
||||
Deleting elements is also simply handled by manipulating links.
|
||||
|
||||
Once you understand the Simple Linked List (which from here on will be referred as **'List'**), you can move on to the Doubly Linked List.
|
||||
|
||||
A List as illustrated below is made up of the following components:-
|
||||
`
|
||||
```
|
||||
#### Arrays have the following disadvantages:-
|
||||
1. Arrays are static structures and therefore cannot be easily extended or reduced to fit the data set.
|
||||
2. Arrays are also expensive to maintain new insertions and deletions.
|
||||
|
||||
Linked Lists address some of the limitations of arrays. Unlike an array, where all the elements are stored in a contiguous block of memory, in a linked list each element is a separate object and has a **link** to the next element in sequence. This allows a linked list to start with space for only one element, and grow to accomodate an arbitrary number of elements by allocating memory as and when needed.
|
||||
|
||||
Deleting elements is also simply handled by manipulating links.
|
||||
|
||||
Once you understand the Simple Linked List (which from here on will be referred as **'List'**), you can move on to the Doubly Linked List.
|
||||
|
||||
A List as illustrated below is made up of the following components:-
|
||||
```
|
||||
|
||||
` head
|
||||
|
|
||||
@@ -125,13 +126,15 @@ void list :: insertBefore (int int) { عقدة N \* node = new N؛ node-> الأ
|
||||
|
||||
}
|
||||
|
||||
`#### OUTPUT
|
||||
`
|
||||
```
|
||||
#### OUTPUT
|
||||
```
|
||||
|
||||
عدد العقد في القائمة = 5 50 40 30 20 10
|
||||
|
||||
`#### Explanation
|
||||
`
|
||||
```
|
||||
#### Explanation
|
||||
```
|
||||
|
||||
حزب الشعب الكمبودي
|
||||
|
||||
@@ -165,8 +168,9 @@ void list :: insertBefore (int int) { عقدة N \* node = new N؛ node-> الأ
|
||||
|
||||
حزب الشعب الكمبودي قائمة :: قائمة () { رئيس = NULL؛ إنهاء = NULL؛ عد = 0؛ }
|
||||
|
||||
`The default constructor is used to initialize the data members of the List class with default values
|
||||
`
|
||||
```
|
||||
The default constructor is used to initialize the data members of the List class with default values
|
||||
```
|
||||
|
||||
حزب الشعب الكمبودي void list :: insertBefore (int int) { عقدة N \* node = new N؛ node-> الأسطوانات = البيانات؛ node-> ذيل = NULL؛
|
||||
|
||||
@@ -246,8 +250,9 @@ void list :: insertBefore (int int) { عقدة N \* node = new N؛ node-> الأ
|
||||
}
|
||||
`
|
||||
|
||||
`Now Execute code
|
||||
`
|
||||
```
|
||||
Now Execute code
|
||||
```
|
||||
|
||||
اترك LL = new LinkedList ()؛
|
||||
|
||||
@@ -258,19 +263,21 @@ void list :: insertBefore (int int) { عقدة N \* node = new N؛ node-> الأ
|
||||
console.log(LL);
|
||||
`
|
||||
|
||||
`Representation in C:
|
||||
A linked list is represented by a pointer to the first node of the linked list. The first node is called head. If the linked list is empty, then value of head is NULL.
|
||||
Each node in a list consists of at least two parts:
|
||||
1) data
|
||||
2) pointer to the next node
|
||||
In C, we can represent a node using structures. Below is an example of a linked list node with an integer data.
|
||||
In Java, LinkedList can be represented as a class and a Node as a separate class. The LinkedList class contains a reference of Node class type
|
||||
`
|
||||
```
|
||||
Representation in C:
|
||||
A linked list is represented by a pointer to the first node of the linked list. The first node is called head. If the linked list is empty, then value of head is NULL.
|
||||
Each node in a list consists of at least two parts:
|
||||
1) data
|
||||
2) pointer to the next node
|
||||
In C, we can represent a node using structures. Below is an example of a linked list node with an integer data.
|
||||
In Java, LinkedList can be represented as a class and a Node as a separate class. The LinkedList class contains a reference of Node class type
|
||||
```
|
||||
|
||||
C // عقدة قائمة مرتبطة عقدة البنية { بيانات int؛ عقدة البنية \* التالي ؛ }؛
|
||||
|
||||
`# Linked List with three elements
|
||||
`
|
||||
```
|
||||
# Linked List with three elements
|
||||
```
|
||||
|
||||
ج // برنامج C بسيط لتقديم // قائمة مرتبطة
|
||||
|
||||
|
@@ -72,27 +72,29 @@ localeTitle: كومات
|
||||
|
||||
على سبيل المثال ، يحتوي مصفوفة في JavaScript على طرق **دفع** و **pop** تسمح لأحد بتطبيق وظائف المكدس بسهولة في أحد التطبيقات.
|
||||
|
||||
`stack = [];
|
||||
|
||||
let i = 0;
|
||||
while(i < 5)
|
||||
stack.push(i++);
|
||||
|
||||
while(stack.length) {
|
||||
stack.pop();
|
||||
}
|
||||
`
|
||||
```js
|
||||
stack = [];
|
||||
|
||||
let i = 0;
|
||||
while(i < 5)
|
||||
stack.push(i++);
|
||||
|
||||
while(stack.length) {
|
||||
stack.pop();
|
||||
}
|
||||
```
|
||||
|
||||
يمكن أن تؤدي قائمة في Python أيضًا وظيفة مكدس في أحد التطبيقات. بدلا من **الدفع** ، يمكن للمرء أن يستخدم طريقة **إلحاق** .
|
||||
|
||||
`stack = []
|
||||
|
||||
for i in range(5):
|
||||
stack.append(i)
|
||||
|
||||
while len(stack):
|
||||
stack.pop()
|
||||
`
|
||||
```python
|
||||
stack = []
|
||||
|
||||
for i in range(5):
|
||||
stack.append(i)
|
||||
|
||||
while len(stack):
|
||||
stack.pop()
|
||||
```
|
||||
|
||||
#### تطبيقات
|
||||
|
||||
|
Reference in New Issue
Block a user