لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 06/28/23 في كل الموقع
-
مستواي في البرمجة صفر، وأريد أن اتعلم البرمجة ولكن سؤالي ان كنت أريد تعلم البرمجة في مجال الهكر الأخلاقي فأي الدورات مناسبة لي؟ وهل يوجد عمل في حال انني انتهيت من الدورة علما ان عمرة 16 عاما، ام يجب أن يكون عمري 18 عاما على الاقل؟؟2 نقاط
-
هذا صحيح ومقصود، ألا يتم التعمق في التفاصيل المملة في مسار الأساسيات وإذا كنت على دراية مسبقة بهذه المعلومات الاساسية فيمكنك المتابعة إلا ما يليها علماً انه هنالك مسار يحتوي على تفاصيل اكثر وهو موجود في ارشيف المسارات الأقدم. بالعودة إلى سؤالك فنعم يوجد توسع اكبر بكثير في المستويات المتقدمة.2 نقاط
-
أستعمل Laravel (أريد استبدال الإشعارات الخاصة بلوحة التحكم بـ FCM بدل Pusher) أريد عمل الـ Driver التالي FCM BROADCAST_DRIVER=fcm كيف يمكنني فعل ذلك؟1 نقطة
-
السلام عليكم هل يوجد فرق بين معهد حسابات ومعلومات و جامعة حسابات في مصر ؟1 نقطة
-
Username for 'https://github.com': Password for fatal: Authentication failed for ابغا اعمل push ولاكن يطلب من يالمستخدم والباسوورد وجربت ادخل ماقبل يجوز انا غلطانه بالبيانات المطلوبة او شي كاعداد ل github لاني هذا اول مرة اتعامل معه ياليت تساعدوني1 نقطة
-
لماذا لم نضف خاصية unique في $table->string('username') و اضفناها عند عملية التحقق ؟1 نقطة
-
1 نقطة
-
الاساسيات جدا مقتضبة هل يوجد توسع في المستويات المتقدمة ؟1 نقطة
-
public function store(Request $request) { $data = $request->validate([ 'image'=>'required|mimes:jpg,gif,png,jpeg', 'description' =>'required' ]); $image = $request['image']->store('posts' ,'public'); $data['image'] = $image; $data['slug'] = Str::random(10); // Post::created($data); this one is valid as well as this one : auth()->user()->posts()->create($data) auth()->user()->posts()->create($data); return redirect()->back(); }1 نقطة
-
سبب المشكلة هو أن المسار الذي تحاول استخدامه فارغ، أي عدم تعيين المسار الصحيح لحفظ الصورة المرفوعة، وأنت تستخدم الدالة store() لحفظ الصورة، وتحدد المجلد "posts" وتستخدم القرص المحلي "public". وللتأكد من أن المشكلة ليست بسبب خطأ في المسار، هل تحققت من وجود المجلد "posts" في القرص المحلي "public" في مشروعك؟ وإذا كان المجلد غير موجود، فتستطيع إنشائه يدويًا. وإذا كان المجلد موجودًا ولا تزال تواجه المشكلة، فربما هناك خطأ آخر في الطريقة التي ترفع بها الصورة، ومن الأفضل التحقق من قيمة $request['image'] والتأكد من أنها صحيحة وتحتوي على الصورة المطلوبة. وربما لديك مشكلة في الكتابة إلى مجلد temp في C:\Windows\Temp عليك بالضغط بزر الفأرة الأيمن على مجلد temp ثم اختيار properties ثم ستجد خيار باسم read-only قم بإزالة العلامة ثم ok للحفظ. وأيضًا تستطيع استخدام دالة dd لمعرفة المسار كالتالي: dd($request['image']); وسيتم عرض معلومات المتغير $request['image'] بشكل مفصل، بما في ذلك المسار وأي بيانات أخرى متعلقة بالصورة.1 نقطة
-
أظنك تقصد "حاسبات"، وعموما نعم، يوجد فرق طفيف رغم أن الشهادة معادلة في كليهما. فمعهد حاسبات ومعلومات: يعتبر مؤسسة تعليمية تقدم برامج تعليمية في مجالات الحاسبات وتكنولوجيا المعلومات. يهدف إلى تأهيل الطلاب للعمل في مجالات تقنية المعلومات مثل تطوير البرمجيات، نظم المعلومات، تحليل البيانات، أمن المعلومات وغيرها. عادةً ما تكون مدة الدراسة في المعهد محدودة وتتراوح بين عامين إلى ثلاث سنوات. أما كلية حاسبات: فهي مؤسسة تعليمية جامعية تقدم برامج درجة البكالوريوس والماجستير في مجالات حاسبات وتكنولوجيا المعلومات. تشمل البرامج الأكاديمية في الجامعة مجموعة واسعة من التخصصات مثل علوم الحاسب، هندسة البرمجيات، نظم المعلومات، الذكاء الاصطناعي، الشبكات والأمن وغيرها. تهدف الجامعة إلى توفير تعليم عالي المستوى وبحث متقدم في مجالات الحاسبات وتكنولوجيا المعلومات.1 نقطة
-
السلام عليكم سوال برمجه A hero is on his way to the castle to complete his mission. However, he's been told that the castle is surrounded with a couple of powerful dragons! each dragon takes 2 bullets to be defeated, our hero has no idea how many bullets he should carry.. Assuming he's gonna grab a specific given number of bullets and move forward to fight another specific given number of dragons, will he survive? Return true if yes, false otherwise وهد الكود def hero(bullets, dragons): if bullets >= 2 and dragons == 2: return True else: return False hero(8 , 4) اين يوجد الخطاء1 نقطة
-
المطلوب هو إنشاء دالة تستقبل عدد الرصاصات التي يحملها البطل (bullets) وعدد التنانين المحيطة بالقلعة (dragons)، وتقوم بإرجاع قيمة True إذا كان البطل قادرًا على الفوز على جميع التنانين والبقاء على قيد الحياة، وإلا فإنها ترجع قيمة False. والكود لديك لا يحقق الشروط المطلوبة لحل السؤال بشكل صحيح، فأنت نفذت الشرط (bullets >= 2) ولكنك لم تقدم الشرط الثاني (dragons == 2) بشكل صحيح. وبناءًا على المطلوب، ليس هناك حاجة محددة لعدد الرصاص المطلوب أن يكون 2 فقط، بل يمكن أن يكون أي عدد من الرصاصات المتاحة، أيضًا يجب أن تكون قادرًا على معالجة عدد أكبر من 2 تنين. أي تعديل الكود ليصبح كالتالي: def can_defeat_dragons(num_dragons, num_bullets): return num_dragons <= num_bullets // 2 وباستدعاء الدالة can_defeat_dragons(4, 8 ), سترجع القيمة True لأن البطل يحمل 8 رصاصات وهناك 4 تنانين، وبما أن 8 // 2 = 4، فإن الشرط يتحقق ويمكن للبطل الفوز على جميع التنانين، كالتالي: print(can_defeat_dragons(4, 8))1 نقطة
-
يبدو أن السؤال خاص بأحد الدروس من أحد الدورات، من فضلك قم بطرح الأسئلة الخاصة بدرس ما أسفل ذلك الدرس. و لكن كجواب على سؤالك بشكل عام فإن عملية التحقق يمكن وضعها في 3 أماكن و ذلك حسب أهمية هذا التحقق و هذه الأماكن بالترتيب من الأضعف إلى الأقوى: لدى المستخدم، هذا يتم مثلاً عندما تقوم بإدخال بريد الكتروني ليس له النمط العام لأي بريد الكتروني، أو عندما تحاول إدخال نص في مربع إدخال يقبل أعداد فقط. هذا النوع من التحقق جيد لتخفيف العبء على السيرفر من ناحية الطلبات الخاطئة و يساعد المستخدم على معرفة ما الذي عليه إدخاله بشكل أسرع و بالتالي يعطي تجربة جيدة للمستخدم. لكن هذا النوع يمكن تجاوزه بسهولة عن طريق إرسال طلب بشكل مباشر بدلاً من استعمال المتصفح و الكثير من الطرق الأخرى و بالتالي من غير الجيد استعماله للأمور الحساسة. في السيرفر، هذا يتم بعد إرسال المستخدم لبياناته يقوم السيرفر بالتحقق من هذه البيانات و من أنها تراعي الشروط المطلوبة. هذا أكثر أماناً من الطريقة السابقة و دائماً يمكن استعماله للأمور الحساسة و لكن الخطأ البرمجي هنا قد يسبب مشاكل غير ملحوظة. في قاعدة البيانات، هذا النوع مهم جداً لضمان أنه حتى في حال حدوث خطأ برمجي لن يتم إدخال بيانات غير مناسبة إلى قاعدة البيانات و هو مهم جداً كما في المثال الذي ذكرته. طبعاً يمكن استعمال الطرق الثلاث السابقة معاً، و لكن هذا يعتمد على حساسية التطبيق الذي تقوم ببناءه و متطلباته، بالتالي في حالتك من الجيد إضافة الشرط إلى قاعدة البيانات و لكن قد يكون ليس هذا هو الغرض من الدرس و لذلك لم يتم إضافته، و لكن عندما تقوم ببناء تطبيق حقيقي فمن الأفضل أن تضيف الأنواع الثلاث من التحققات.1 نقطة
-
هل ال 72 ساعة هي مسار الارشيف والمسار الجديد ام الجديد فقط ؟ وشكرا على الاجابة1 نقطة
-
هناك طريقتان لحل هذا التمرين. أول طريقة تتمثل في أن تستعمل مقارنة المحارف مباشرة، و هنا سينجح الأمر لأن ترتيب المحارف الخاصة بالخانات موافق لترتيب الأرقام، أي المحرف '1' أصغر من المحرف '2' ، في هذه الحالة يمكنك فقط استعمال ما يدعى list comprehension للقيام بذلك بالإضافة إلى الدالة join، كما يلي: s = "41345491294358" res = ''.join(['1' if x >= '5' else '0' for x in s]) print(res) هذا هو الحل الأمثل بالنسبة للغة البايثون، حيث أن هذه هي الطريقة المفضلة للكتابة في هذه اللغة، بالطبع يمكنك القيام بكتابة حلقة عادية و الإضافة إلى لائحة و من ثم الدمج و لكن ذلك سيكون أسلوب اللغات الاخرى مثل c++ و ليس بايثون. الطريقة الثانية لحل هذه المسألة تكون ببناء الحل مباشرة إلى سلسلة نصية، أي بدلاً من التخزين في مصفوفة و من ثم التحويل إلى سلسلة نصية نقوم فوراً بالإضافة إلى سلسلة نصية، كما يلي: s = "41345491294358" res = '' for x in s: res += '1' if x >= '5' else '0' print(res)1 نقطة
-
نقوم باستعمال البحث الثنائي لتسريع عملية البحث، أي بدلاً من أن نبحث بشكل خطي عن عنصر يمكنك استعمال البحث الثنائي، و هذا له شرطان، أولاً أن تكون العناصر مخزنة بشكل خطي (سأشرح ذلك فيما يلي) ثانياً أن تكون العناصر مرتبة. و بالتالي في حال لم تكن العناصر مخزنة بشكل خطي لا معنى من البحث الثنائي، لأنه في تلك الحالة ستكون العناصر مخزنة بشكل يسرع البحث تلقائياً. مثلاً في القواميس بلغة البايثون يمكن الوصول إلى مفتاح بشكل مباشر و بسرعة كبيرة و ذلك لأن عناصر القاموس ليست مخزنة بشكل خطي و بالتالي لا فكرة من البحث الثنائي. كذلك الأمر بالنسبة للمجموعات set فالبحث فيها سريع جداً. بالطبع يمكنك استخراج عناصر القاموس و من ثم القيام بعملية بحث ثنائي و لكن ليس من ذلك أي فائدة.1 نقطة
-
أهلاً بك رائد وكل عام وأنت بخير، أولاً ستجد الكثير من الإجابات على أسئلتك بخصوص أكاديمية حسوب في صفحة مركز المساعدة والتي تستطيع الوصول إليها من الروابط أسفل الموقع. وبها مثلاً ستجد شرح لكيفية الوصول للدورات التي اشتركت بها، وذلك من خلال الضغط على تبويب دوراتي وستجد الدورات المشترك بها كما بالصورة: وأيضًا من نفس التبويب ستجد كل الدورات الأخرى المتاحة، وتستطيع دراسة المسار الأول من كل الدورات بشكل مجاني. وبخصوص طرح الأسئلة، فلا تقلق ستجد مساعدة من قبل الجميع هنا، ما عليك سوى طرح سؤالك أسفل الفيديو في الدورة ستجد قسم تعليقات أضف السؤال المتعلق بالفيديو أسفله، وسيتم الإجابة عليك في أسرع وقت. ولكن الأسئلة العامة الغير متعلقة بالدورة أرجو منك طرحها في قسم أسئلة البرمجة كما فعلت هنا. وستجد أيضًا في مركز المساعدة شرح لكيفية طرح السؤال والتواصل مع المدربين. وكنصيحة حاول أن تشرح ما الذي تريد فعله وما المشكلة التي واجهتك بشكل واضح أو ما وقت الفيديو الذي لديك سؤال حوله، مثال: "في الدقيقة 4.10 أريد فهم كذا أو لدي مشكلة كذا"، او ذكر رقم التمرين وهكذا. وسيتم إرشادك لحل لكيفية حل المشكلة بنفسك أولاً لكي تستفيد، ثم تفقد المشكلة وتوفير الحل إذا واجهت صعوبة. وأيضًا تستطيع تفقد مستودع المشروع والذي به الكود النهائي وستجد الرابط الخاص به في المدخل او في مقدمة المسار. وأنصحك بالإطلاع على النقاش التالي والنقاشات المرفقة به وستجد به استفادة كبيرة لك:1 نقطة
-
ببساطة حتى لا يتم تعقيد الموضوع مطور REST API هو المطور الذي يعمل على جانب الخادم ويقوم ببناء وتطوير وصيانة API المبنية على أساسيات REST. REST هو أسلوب في بناء الواجهات البرمجية لتطبيقات الويب. ويعتمد على استخدام بروتوكول HTTP للتواصل بين الأنظمة. فالمطور يقوم بتحديد طرق HTTP مثل GET و POST و PUT و DELETE وربط كل طريقة بمورد معين. كما يقوم بتحديد كيفية معالجة كل طلب وإرجاع استجابة مناسبة. إذاً المطور الذي يمتلك مهارة REST API هو: ملم بأساسيات بروتوكول HTTP وطرقه. قادر على تصميم هيكلية نظام REST API بالشكل الصحيح. يستطيع بناء API باستخدام إحدى تقنيات بناء API مثل ASP.NET Web API أو Spring Boot أو Node.js Express وغيرها. قادر على وضع التوثيق المناسب للـ API ليستخدمها المطورون الآخرون. ملم بأفضل الممارسات لبناء وتأمين REST API. قادر على صيانة وتطوير الـ API وإدارة دورات حياتها.1 نقطة
-
ببساطة مهارة REST API أو RESTful API تعني قدرتك على تصميم وتطوير وتفهم واجهات برمجة التطبيقات (API) باستخدام نمط REST (Representational State Transfer). REST هو نمط معماري يستخدم في تطوير الويب للتواصل بين العميل (Client) والخادم (Server) من خلال استخدام مجموعة من الأساليب المحددة مثل GET وPOST وPUT وDELETE. ويستند REST إلى مجموعة من المبادئ والقيود التي تسهل الاتصال والتفاعل بين العميل والخادم: تمثيل الموارد (Resources): يتم تمثيل البيانات والموارد في النظام عن طريق معرفات فريدة (مثل عناوين URL) ويتم الوصول إليها والتعامل معها عن طريق طلبات HTTP. واجهات معيارية (Standardized Interfaces): يستخدم REST مجموعة من طرق الطلبات المعيارية في HTTP مثل GET وPOST وPUT وDELETE للتفاعل مع الموارد. إنعدام الحالة (Stateless): كل طلب منفصل بذاته ولا يتم تخزين حالة العميل على الخادم بين الطلبات، وترسل كافة المعلومات اللازمة للخادم في كل طلب. التفاعل المستقل (Self-contained Interactions): تشمل طلبات REST كل المعلومات اللازمة لإجراء العملية المطلوبة، بما في ذلك أي بيانات إضافية أو تعليمات مطلوبة. التوجيه المحدود (Limited Coupling): يعتمد REST على فصل العميل والخادم بشكل مستقل، ولا يعتمد على المعرفة المسبقة للعميل بشأن تفاصيل الخادم، وبالعكس. أي من يمتلك مهارة REST API قادر على العمل في كلا الجانبين: جانب العميل وجانب الخادم. وفيما يلي توضيح للدورين: 1- جانب العميل (Client-side) يطور تطبيق أو موقع ويب يتفاعل مع API الخادم. يستخدم طلبات HTTP المختلفة مثل GET وPOST للتواصل مع الخادم. يقوم ببناء واجهة المستخدم (UI) لعرض البيانات المستردة من الخادم باستخدام بيانات المستجيبة التي تم تلقيها عبر API. 2- جانب الخادم (Server-side) ينشئ API باستخدام تقنيات RESTful للسماح للعملاء بالتواصل مع البيانات والخدمات التي يقدمها الخادم. يعمل على تصميم وتطوير واجهات البرمجة API التي توفر الوصول إلى مجموعة محددة من البيانات أو العمليات. ينشئ نماذج البيانات ويحدد طرق الوصول إلى هذه البيانات بما يتوافق مع مبادئ REST. وفي العمل، يمكن للمبرمجين أن يكونوا متخصصين في جانب واحد من REST API، مثل مطوري الواجهة الأمامية (Front-end Developers) الذين يتعاملون بشكل رئيسي مع API الخادم على الطرف العميل، أو مطوري الخادم (Back-end Developers) الذين ينشئون ويديرون ال API نفسها على الطرف الخادم. وإليك مثال لكود JavaScript يوضح كيفية تنفيذ REST API لمصادر المستخدمين باستخدام إطار عمل Express.js أي في الواجهة الخلفية: const express = require('express'); const app = express(); // بيانات المستخدمين المؤقتة let users = [ { id: 1, name: 'John' }, { id: 2, name: 'Jane' } ]; // استرداد جميع المستخدمين app.get('/users', (req, res) => { res.json(users); }); // إنشاء مستخدم جديد app.post('/users', (req, res) => { const newUser = { id: users.length + 1, name: req.body.name }; users.push(newUser); res.status(201).json(newUser); }); // تشغيل الخادم app.listen(3000, () => { console.log('Server started on port 3000'); }); أما التعامل مع REST API في الواجهة الأمامية فهو كالتالي: // استدعاء API لاسترداد جميع المستخدمين async function getUsers() { try { const response = await fetch('/users'); const data = await response.json(); // استخدام البيانات المستلمة console.log(data); // يتم طباعة المستخدمين في وحدة التحكم } catch (error) { console.error('Error:', error); } } // استدعاء API لإنشاء مستخدم جديد async function createUser() { const newUser = { name: 'Alice' }; try { const response = await fetch('/users', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(newUser) }); const data = await response.json(); // استخدام البيانات المستلمة console.log(data); // يتم طباعة المستخدم الجديد في وحدة التحكم } catch (error) { console.error('Error:', error); } } // استدعاء الدوال المحددة getUsers(); createUser(); وبالإضافة إلى REST، هناك عدة معماريات أخرى تستخدم في تطوير وتصميم واجهات برمجة التطبيقات، مثل: معمارية SOAP (Simple Object Access Protocol): تستخدم في تطوير واجهات برمجة التطبيقات المبنية على نمط XML وتتطلب بروتوكولات معقدة للتواصل. معمارية GraphQL: تسمح للعميل بتحديد البيانات المحددة التي يُرغب في استردادها، مما يزيد من كفاءة استرداد البيانات ويقلل من حمولة الشبكة. معمارية gRPC: تعتمد على نمط RPC (Remote Procedure Call) للتواصل بين العميل والخادم، وتستخدم تسلسل البيانات بتنسيق Protocol Buffers.1 نقطة
-
هاته ليست الطريقة الصحيحة لاستعراض مشروع لارافيل، كما أن تشغيل خادم vite لا يغني عن تشغيل خادم artisan أو تشغيل التطبيق من على xampp عموما. قم بتشغيل الامر: php artisan serve مع الأمر: npm run dev ثم قم باستعراض المشروع من على الرابط المتحصل عليه من تشغيل الأمر الأول، هو عادة ما يكون: http://127.0.0.1:8000/ يفترض أن يعمل معك الآن.1 نقطة
-
تستعرض هذه المقالة مفهوم التعقيد Complexity، وهو أحد المفاهيم الأساسية في علم الخوارزميات، مع ذكر بعض أهم أصناف التعقيد وبعض الترميزات المستخدمة في ذلك. ترميز Big-Omega تُستخدم ترميز Ω -notation لتمثيل المقارِب الأدنى asymptotic lower bound. التعريف الرسمي لتكن fn) و g(n) دالتين مُعرّفتين على مجموعة الأعداد الحقيقية الموجبة، فنقول أنّ f(n) = Ω(g(n)) في حال وُجِدت ثابتان موجبان c و n0 يحققان الآتي لكل n أكبر من أو تساوي n0: 0 ≤ c g(n) ≤ f(n) نظرية بالنسبة لدالتين f(n) و g(n)، نقول أنّ f(n) = Ө(g(n)) فقط إذا كان الآتي محققًا: f(n) = O(g(n)). f(n) = Ω(g(n)). يمكن تمثيل ترميز Ω بيانيًا على النحو التالي: على سبيل المثال، إذا كانت f(n) = 3n^2 + 5n - 4 فستكون f(n) = Ω(n^2)، كما ستكون f(n) = Ω(n) أو حتى f(n) = Ω(1) صحيحة. لدينا مثال آخر يحل خوارزمية التطابق التام matching algorithm، حيث إذا كان عدد الرؤوس vertices فرديًا، فسنحصل على الخرج "No Matching Matching"، وإلا فينبغي تجربة جميع التطابقات الممكنة. وكنا نودّ القول أنّ الخوارزمية تتطلب وقتًا أسيًا exponential time، لكن الواقع أنه لا يمكنك إثبات وجود حدّ أدنى Ω(n^2) باستخدام التعريف المعتاد لـ Ω نظرًا لأنّ الخوارزمية تُجرى في وقت خطي linear time لقيم n الفردية. وبدلًا من هذا فيجب علينا تعريف f(n)=Ω(g(n)) على نحو أنه بالنسبة لثابت c قيمته أكبر من الصفر، فهناك عدد لا نهائي من قيم n التي تحقّق الآتي: f(n)≥ c g(n) يوفّق هذا التعريف بين الحدّين الأعلى والأدنى إذ يحقّق التكافؤ الآتي: f(n)=Ω(g(n)) فقط إن كان f(n) != o(g(n)) ترميز Big-Theta على خلاف ترميز Big-O الذي يمثل الحد الأعلى upper bound فقط من وقت تشغيل الخوارزميات، فإنّ ترميز Big-Theta هو رابط محصور Tight bound يشمل الحدّ العلوي والسفلي معًا، وهو أكثر دقة لكنه صعب الحساب. وترميز Big-Theta متماثلة، أي تحقق المعادلة: f(x) = Ө(g(x)) <=> g(x) = Ө(f(x)) ولتفهم ذلك بسهولة، اعلم أن المعادلة الآتية f(x) = Ө(g(x)) <=> g(x) = Ө(f(x))f(x) = Ө(g(x)) تعني أنّ الرسمين البيانيين للدالتين f و g ينمُوان بنفس المعدّل، أو أنّ الرسمين البيانيين "يتصرّفان" بشكل متماثل عند قيم x الكبيرة. والتعبير الرياضي الكامل لترميز Big-Theta هو كما يلي: Ө(f(x)) = {g: N0 -> R and c1, c2, n0 > 0} حيث تكون c1 < abs(g(n) / f(n)) لكل n أكبر من n0، وتمثل abs القيمة المطلقة. ﻣﺜــــﺎل إذا كانت الخوارزمية تأخذ العدد الآتي عمليةً للانتهاء مقابل مُدخل n، فنقول أنّ تعقيدها يساوي O(n^2) ، كما يساوي أيضًا O(n^3) وO(n^100). 42n^2 + 25n + 4 أمّا في حال ترميز Big-Theta، فنقول أنّ التعقيد يساوي Ө(n^2)، لكن لا يساوي Ө(n^3) أو Ө(n^4)، إلخ… . كذلك، فإن كانت الخوارزمية من نوع Ө(f(n))، فستكون أيضًا من النوع O(f(n))، ولكن ليس العكس. التعريف الرياضي تُعرّف Ө(g(x)) على أنها مجموعة من الدوال، أما تعريفها الرياضي الرسمي Formal mathematical definition فهو: Ө(g(x)) = f(x)} وإذا كانت هناك ثوابت موجبة N وc1 و c2، بحيث يكون 0 <= c1*g(x) <= f(x) <= c2g*(x) لكل x أكبر من N}. وهذا يعني أنّ Ө(g(x)) هي مجموعةٌ تحتوي كلّ دالة f مُحاصَرة من قبل الدالة g، بمعنى أنّه توجد 3 ثوابت موجبة هي c1 و c2 وN، بحيث يكون لدينا: 0 <= c1*g(x) <= f(x) <= c2*g(x) لكل عدد x أكبر من N. وبما أن Ө(g(x)) مجموعةً فيمكننا كتابة الآتي للإشارة إلى أنّ f(x) تنتمي إلى Ө(g(x)). f(x) ∈ Ө(g(x)) غير أن الشائع هو كتابة الآتي للتعبير عن نفس الترميز: f(x) = Ө(g(x)) ويمكن تفسير Ө(g(x)) عندما تظهر في ترميز ما على أنّها كناية عن دالة مجهولة لا تهمّنا تسميتها، فمثلًا، المعادلة الآتية: T(n) = T(n/2) + Ө(n) تكافئ T(n) = T(n/2) + f(n) حيث تمثّل f(n) دالةً ما من المجموعة Ө(n)ا وإن كانت f و g دالتين مُعرَّفتين على نفس النطاق من مجموعة الأعداد الحقيقية real numbers، فإننا نكتب الآتي: f(x) = Ө(g(x)) عندما تؤول x إلى ما لا نهاية x->infinity، وذلك فقط في حالة وجود ثابتْين موجبيْن K و L وعدد حقيقي x0 يحققون K|g(x)| <= f(x) <= L|g(x)| لكل x أكبر من أو تساوي x0. يكون التعريف مكافئًا للعبارة التالية: f(x) = O(g(x)) والعبارة: f(x) = Ω(g(x)) استخدام مفهوم النهايات limits إذا كان لدينا limit(x->infinity) f(x)/g(x) = c ∈ ( 0,∞) أي أنّ النهاية موجودة وموجبة، أي: f(x) = Ө(g(x)) وفيما يلي بعض أصناف التعقيد الشائعة: table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; } الاسم الترميز n = 10 n = 100 Constant - ثابت Ө(1) 1 1 Logarithmic - لوغارتمي Ө(log(n)) 3 7 Linear - خطي Ө(n) 10 100 Linearithmic - لوغارتمي-خطي Ө(n*log(n)) 30 700 Quadratic - تربيعي Ө(n^2) 100 10000 Exponential - أسّي Ө(2^n) 1024 1.267650e+ 30 Factorial - مُعاملي Ө(n!) 3 628 800 9.332622e+157 موازنة الصيغ المقاربة asymptotic notations لتكن f(n) و g(n) دالتين مُعرّفتين على مجموعة الأعداد الحقيقية الموجبة، ولتكن c, c1, c2, n0 ثوابت حقيقية موجبة. يوضّح الجدول التالي الفروق بين مختلف الصيغ: الترميز f(n) = O(g(n)) f(n) = Ω(g(n)) f(n) = Θ(g(n)) f(n) = o(g(n)) f(n) = ω(g(n)) التعريف الرسمي ∃ c > 0, ∃ n0 > 0 : ∀ n ≥ n0, 0 ≤ f(n) ≤ c g(n) ∃ c > 0, ∃ n0 > 0 : ∀ n ≥ n0, 0 ≤ c g(n) ≤ f(n) ∃ c1, c2 > 0, ∃ n0 > 0 : ∀ n ≥ n0, 0 ≤ c1 g(n) ≤ f(n) ≤ c2 g(n) ∀ c > 0, ∃ n0 > 0 : ∀ n ≥ n0, 0 ≤ f(n) < c g(n) ∀ c > 0, ∃ n0 > 0 : ∀ n ≥ n0, 0 ≤ c g(n) < f(n) التشابه مع الموازنة بين عددين a وb a ≤ b a ≥ b a = b a < b a > b أمثلة 7n + 10 = O(n^2 + n - 9) n^3 - 34 = Ω(10n^2 - 7n + 1) 1/2 n^2 - 7n = Θ(n^2) 5n^2 = o(n^3) 7n^2 = ω(n) الرسوم البيانية يمكن تمثيل الصيغ المُقارِبة بواسطة مخطّط فِن كما يلي: ترجمة -بتصرّف- للفصل الثاني من كتاب Algorithms Notes for Professionals اقرأ أيضًا المقالة السابقة: مدخل إلى الخوارزميات دليل شامل عن تحليل تعقيد الخوارزمية بناء مصنف بالاعتماد على طرق تعلم الآلة بلغة بايثون باستخدام مكتبة Scikit-Learn النسخة الكامة من كتاب مدخل إلى الذكاء الاصطناعي وتعلم الآلة1 نقطة
-
بروتوكول SOAP إن صحت تسميته، يركز على أن تكون المخرجات عبارة عن دوال لها هدف معين. أنت تقوم بعمل WebService باستخدام SOAP بها عدة دوال يمكن استخدامها، مثلا دالة حساب عملات، دالة إعادة الطقس بناء على المدينة، دالة تعطيها رقم بالميل، تعيدها لك بالكيلومتر، وهكذا. بروتوكول REST يركز على إخراج قاعدة بيانات كاملة أو جداول منها وتطبيق عمليات CRUD ، وهي Create, Read , Update , Delete ، مثلا جلب البيانات وتعديلها والإضافة منها وهكذا. وهو حل للوصول لقاعدة البيانات عن طريق بروتوكول HTTP ، ولو أردنا أن نستخدم SOAP للوصول لقاعدة البيانات، فيجب علينا أن نعمل لكل جدول 4 دوال على الأقل، كل دالة تستدعي جزء من CRUD . فعليا SOAP له مزايا أكثر من ناحية تحديد الأمان والمرسل والمستقبل، ووضع خصائص مطولة ومفصلة لكل جزئية في الاتصال به، بعكس بروتوكول REST لا يوجد من هو أفضل، فلكل منهما استخدام ، تريد إخراج دوال عليك ب SOAP ، تريد إخراج قاعدة البيانات عليك ب RESTful المصدر من هنا http://blog.smartbear.com/apis/understanding-soap-and-rest-basics/1 نقطة