بدر ربنا يرزقه
بدر ربنا يرزقه

@TsukiHyouka

21 تغريدة 17 قراءة Jul 06, 2024
اتعلمت اساسبات java
حاليا بزاكر data structures و فاهمها ك topic بس مش فاهم استخدمها امتي ولا ازاي و دورها بيجي أمتى بظبط

سؤالك جميل - حاسسها بقيت لازمة عندي -
جوابي هنا هيتشابه مع جوابي على ال oop بس هنناقش موضوع شيق آخر غير problem-solution نبدأ بسم الله
ال data structure كفرع من ال computer science هو قايم على فكرة بسيطة
How should we store data?
عندنا memory عايز نخزن فيها الداتا اللي هنستعملها في ال softwares نخزنها ازاي؟
عشان تحدد طريقة التخزين محتاج تفكر في بعد تاني وهو طبيعة الاستهلاك.
ليه نفكر في طبيعة الاستهلاك برضو؟
احنا ناويين نستعمل الداتا دي مش نخزنها بس فمهم استعمالها يبقى efficient.
وهنا ناخد crash course عن ال data structures الموجودة وازاي طريقة التخزين بتتأثر بطبيعة الاستهلاك.
Arrays
دا أول data structure بتدرسه.
أنا دلوقتي عندي مشكلة إني عايز اخزن list من الأرقام وال list دي عارف حجمها هعمل كدا ازاي من غير ال arrays؟
هعرف variables بنفس العدد دا صح؟
ايه المشكلة في كدا؟
حاجتين:
- الموضوع مقبول لو العدد قليل
- ال variables هتبقى متبعترة في ال memory
ال Array بتيجي بكل المشكلتين دول
- كبر ال list مبقاش مشكلة لإنها one point of access.
- ال variables متخزنة ورا بعض في ال memory ودا بيخلق easy access اللي كنت عايزه من إني أعرف variable لكل item
ازاي التصميم دا اتأثر بطبيعة الاستهلاك؟
أنا كنت بخزن ال list دي وأنا مهتم إني أقدر أتعامل مع كل entry منها زي الباقي
read/write
Stack
وهو من أقدم ال data structures كونه مستخدم بشكل أساسي في ال os.
معايا list برضو بس مش ناوي أتعامل معها غير entry by entry والترتيب مهم بالنسبة بحيث إن الأحدث يبقى الأهم.
LIFO last in first out
هصممها ازاي ؟
Point of access: last entry
Point of storing: last entry
عندك slot فاضية اسمها last entry عايز التركيز يكون عليها كلما تعمل store ل entry جديدة تاخد هي الدور دا ولما تيجي تستهلكها تدي الدور دا للي قبلها.
Queue
قديم بقدم ال stack وهو برضو مستخدم في ال os بشكل رئيسي مع ال processes.
نفس الموضوع في ال stack بس الأولوية بتروح للأقدم.
FIFO first in first out
هصممها ازاي ؟
Point of access: first entry
Point of storing: last entry
تصميم الاتنين دول متأثر بشكل أساسي بالترتيب أنت مش عايز تتعامل مع ال data ككل ك collection إنما كترتيب.
ممكن حد يسأل هنا ويقول طب ما دا كان ممكن نحقق بال Array الفكرة بس في طريقة استهلاكنا لل array مش لازم ندى أسماء جديدة
وهنا يكون حد له مستقبل بإذن الله.
ال stack وال queue ال implementation بتاعهم معمول بال Array فعلاً.
الفكرة من ال data structure إنها توفر عليك تصميم طريقة الاستهلاك بإنها بتديك interface بسيطة تتعامل معاها
تظهر مشكلة في ال Array وهي ال allocation إننا لازم نعمل allocation لكل المساحة اللي عايزينها بشكل continuous كل entry يبقى وراه أخوه في ال memory ودا بيحطنا قدام مشكلة ال reallocation
تأتي ال linked-list للإنقاذ أنت لسه معاك ال list اللعينة بس عايز تقضي على فكرة ال reallocation تعمل ايه؟
ايه البساطة في ال Array؟ إن ال entry وراه اللي بعديه في ال memory لو مقدرتش أقدم دا ممكن أعمل إيه؟
ممكن أخزن واحتفظ بمكان اللي بعدي.
Node {data, next}
ومن التصميم دا برضو نقدر نعمل ال stack وال queue.
بل هو مناسب أكتر لإن مفيش فيه reallocation واحنا مش محتاجين نتعامل مع الداتا بعيد عن access point واحدة.
كل دا الداتا عندنا بسيطة واستهلاكها مباشر لو الدنيا اتعقدت زي إني مش عايز entry تتكرر؟
هنا بتيجي ال set
المبدأ فيها إنك ترفض تخزين أي duplicate value لإني عايز أتعامل مع unique values بس
طب نعملها ازاي ؟
ممكن نربط ال value بمكانها في ال memory ودا دور ال hashing
إني أعمل map وصلة بين ال value وال place.
حاجة بلعبة الأطفال اللي فيها أشكال محددة
الدائرة مش هتسمح غير لدائرة
المثلث مش هيسمح غير لمثلث
فاللي أنت بتخزنه محكوم بمكان معين بناء على طبيعته.
تعالي نعقد الموضوع أكتر وهو إني مش بس عايز القيمة ما تتكررش إنما عايز أربط بيها قيمة تانية أصلاً
Ali - > 15
Mohamed - > 20
دي الmap
ال map بتزود خطوة زيادة وهي إنها بتخزن القيمة دي في المكان اللي اتحدد من القيمة الأولى
وهنا بنسميهم
Key و value
نعقد الموضوع أكتر الداتا مبقتش linear علاقتها ببعض مبقتش ترتيب إنما بقت adjacency قرب
مش ايه اللي بعدي إنما ايه اللي حوليا
زي شجرة العيلة كدا الداتا بتاعتها مش ترتيب إنما قرب.
شجرة يعني tree و tree يعني graph (دا عندنا احنا بس :")
هنا بنخزن الداتا بمعطيين
ال entry
ال adjacents
ونتوقف عند هذا الحد.
ملاحظ حاجة؟
في pattern أو trend معين إن كل data structure بيجي يحل حاجة غيره ميقدرش يعملها
أو بيوسع من قدرات اللي قبله زي ال map والset
أو بيبص لل data ب dimension أوسع زي ال graph.
المهم إن كله متأثر بطبيعة استهلاك الداتا دي ودا بيرتبط بال algorithms بشكل رئيسي إنما دا موضوع يطول شرحه.
في one-liner لذيذ ممكن يساعد وهو
OOP is about single entities, DS is about entity collection.
الداتا ك instance واحدة بتختلف عن لما تبقي collection وأكتر من واحدة دا دور ال ds.
دورها بيجي أمتى؟
نفس الفكرة هل المشكلة اللي عندك فيها collection من الداتا ولا different entities بس ؟
طالما في collection يبقى ds أنهي واحدة فيهم؟
على حسب الطريقة اللي ناوي تستهلكهم بيها.
وزود عليهم ال common algorithms وبس كدا

جاري تحميل الاقتراحات...