בשחמה יעדמל אובמ - bgu · 2014-03-20 · הלוכמ. הילע םינותנ...

38
מבוא למדעי המחשב מבני נתונים

Upload: others

Post on 17-Jul-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

מבוא למדעי המחשב

מבני נתונים

Page 2: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

Data structure-נתונים מבנה , )data(קבוצה של נתונים מאחסניםבה אנו הצורה •

.שאנחנו מבצעים עליהםהפעולותו)15שיעור (קבוצה –

sizeמערך בגודל קבוע ושדה : המבנה•חיפוש ומחיקה, הכנסה: הפעולות•

:שלוביעילותמבנה נתונים טוב נבחן •שהוא תופס ביחס לכמות הנתונים ) המקום(הזיכרון בכמות –

.הבסיסית שהוא מאחסןהקבוצהלינארית בגודל : 15יעילות מקום של הקבוצה משיעור •

.הפעולות שאנחנו מבצעים על המבנהלביצוע הדרוש בזמן–לינארית בגודל : 15יעילות שלושת הפעולות של הקבוצה משיעור •

הקבוצה.נתונים הוא ענף מחקר חשוב במדעי המחשבמבני •

Page 3: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

כליםארגז

כללים על צרכים מסוים יכול לענות מבני נתונים •שונים

מבני נתונים שונים יכולים לענות על צורך אחד •מסוים

Page 4: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

מכולהשל נתונים עליה מכולהבעיקרון מבנה הנתונים הוא •

אנחנו מבצעים פעולות:פעולות שכיחות•

הכנסת נתון–שליפת הנתון האחרון שהוכנס–שליפת הנתון הראשון שהוכנס–שליפת הנתון המינימלי–שליפת נתון בעל מפתח מסוים–מעבר על כל הנתונים–עדכון נתון––...

Page 5: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

)סיבוכיות(יעילות

)של שטח האחסון(ומקום) של הפעולות(זמן•מקרים•

)best case(טובמקרה–)average case(ממוצעמקרה–)worst case(גרועמקרה–

Page 6: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

Abstract Data Type–אבסטרקטי מבנה נתונים

בצורה נהוג לתאר את מבנה הנתונים קודם •אותו לממשואחר כך ) ממשקים(אבסטרקטית

בצורות שונות לפי הצורך) מחלקות(מבנה נתונים אבסטרקטי התיאור האבסטרקטי נקרא –

)ADT(מבנה נתונים קונקרטיהמימוש נקרא –

הוא )עבור המתכנת(היתרון המשמעותי •באבסטרקציה

שימוש ברמה האבסטרקטית–מימושים שונים–'ראו יתרונות של ממשקים בהנדסת תוכנה וכו–

Page 7: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

ADTשל מערך

מראה (אינדקס הוא אוסף איברים בעלי מערך •.רציף המתחיל מאפס) מקום

:הפעולות•קבלת איבר באינדקס מסוים–אחסון איבר באינדקס מסוים–קבלת גודל המערך–

Page 8: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

ADTשל מערך ב-Java

Java-למה שנרצה בכלל להגדיר בעצמנו מערך ב•?בעצמה מגדירהJava-כשיש כבר אחד כזה ש

public interface Array {Object get(int i);void set(int i, Object x);int size();

}

Page 9: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

מימוש מערך בעל קיבולת קבועהpublic class FixedSizeArray implements Array {

private Object[] arr;

public FixedSizeArray(int size) { arr = new Object[size]; }

public int size() { return arr.length; }public Object get(int i) { return arr[i]; }public void set(int i, Object x) { arr[i] = x; }

}

Page 10: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

מימוש מערך בעל קיבולת משתנהpublic class DynamicArray implements Array {

private Object[] arr;public DynamicArray() { arr = new Object[0]; }public int size() { return Integer.MAX_VALUE; }public Object get(int i) {

if (i < arr.length) return arr[i]; else return null;}public void set(int i, Object x) {

ensureCapacity(i + 1); arr[i] = x;}private void ensureCapacity(int capacity) {

if (capacity > arr.length) {Object[] tmpArr = new Object[capacity];for (int j = 0; j < arr.length; j = j + 1)

tmpArr[j] = arr[j];arr = tmpArr;

}}

}

Page 11: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

בעל קיבולת משתנהנוסף למערך מימוש public class DynamicArray implements Array {

private static final int INCREMENT = 10;private Object[] arr;public DynamicArray(int initialCapacity) {

arr = new Object[initialCapacity];}public DynamicArray() { this(0); }private void ensureCapacity(int capacity) {

if (capacity > arr.length) {Object[] tmpArr = new Object[capacity + INCREMENT];for (int j = 0; j < arr.length; j = j + 1)

tmpArr[j] = arr[j];arr = tmpArr;

}}public Object get(int i) { … }public void set(int i, Object x) { … }public int size() { … }

}

Page 12: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

ADTשל קבוצה

.של איברים ללא חזרותאוסף קבוצה היא •:הפעולות•

הוספת איבר–גריעת איבר–חיפוש איבר–קבלת גודל הקבוצה–

Page 13: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

ADT קבוצה בשל-Javapublic interface Set {void add(Object x);void remove(Object x);boolean contains(Object x);int size();

}

Page 14: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

קבוצה באמצעות מערךמימוש public class SetAsArray implements Set {

private Array arr;private int nElements;

public SetAsArray(Array arr) {this.arr = arr;nElements = 0;

}

public SetAsArray() { this(new DynamicArray()); }

public int size() { return nElements; }

Page 15: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

מימוש קבוצה באמצעות מערךprivate int indexOf(Object x) {

for (int i = 0; i < nElements; i = i + 1)if (arr.get(i).equals(x))return i;

return -1;}

public boolean contains(Object x) { return indexOf(x) != -1; }

public void add(Object x) {if (!contains(x)) {arr.set(nElements, x);nElements = nElements + 1;

}}

Page 16: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

מימוש קבוצה באמצעות מערךpublic void remove(Object x) {

int i = indexOf(x);if (i != -1) {nElements = nElements - 1;arr.set(i, arr.get(nElements));arr.set(nElements, null);

}}

}

Page 17: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

)על חשבון גמישות(הבטחת יעילות

האם צריך לומר במפורש שהמחלקה מממשת את •Setהממשק

public class EfficientSet extends SetAsArray {

public EfficientSet(int maxSize) {super(new FixedSizeArray(maxSize));

}

}

Page 18: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

ADTשל מחסנית

:דוגמאות•מגשים בקפיטריה–מחסנית זמן ריצה–text editor-שמירת פעולות ב–

Page 19: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

ADT מחסנית בשל-Javapublic interface Stack {void push(Object x);Object pop();boolean isEmpty();

}

Page 20: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

מימוש מחסנית באמצעות מערך

11 3 21 -60 1 2 3 4 5 6 7

arr

nElements

Page 21: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

מימוש מחסנית באמצעות מערךpublic class StackAsArray implements Stack {

private Array arr;private int nElements;public StackAsArray(Array arr) {

this.arr = arr; nElements = 0;}public StackAsArray() { this(new DynamicArray()); }public boolean isEmpty() { return nElements == 0; }public void push(Object x) {

arr.set(nElements , x); nElements = nElements + 1;}public Object pop() {

nElements = nElements - 1;Object res = arr.get(nElements);arr.set(nElements, null);return res;

}}

Page 22: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

מאסטר יודה באמצעות מחסנית

it isn’t funny!funny! isn't it?

public static String yoda(String[] sentence) {String res = "";Stack st = new StackAsArray();for (int i = 0; i < sentence.length; i = i + 1)st.push(sentence[i]);

while (!st.isEmpty())res = res + " " + st.pop();

res = res + "?";return res;

}public static void main(String[] args) {String[] sentence = { "it", "isn't", "funny!" };System.out.println(yoda(sentence));

}

Page 23: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

Wrappersשל טיפוסים פשוטים

• Float, Integer, Double, Byte, Long, Short, Boolean, and Character

Character c = new Character('a');c = 'a';Integer x = new Integer(5);x = 5;int y = x.intValue();y = x * 2;Object z = x;z = 5;int t = (Integer) z * 2;t = (int) z * 2;

Page 24: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

בדיקת איזון סוגריים באמצעות מחסנית

input: a((b{c})[d])ei = 0

Page 25: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

בדיקת איזון סוגריים באמצעות מחסנית

input: a((b{c})[d])ei = 1

(

Page 26: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

בדיקת איזון סוגריים באמצעות מחסנית

input: a((b{c})[d])ei = 2

((

Page 27: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

בדיקת איזון סוגריים באמצעות מחסנית

input: a((b{c})[d])ei = 3

((

Page 28: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

בדיקת איזון סוגריים באמצעות מחסנית

input: a((b{c})[d])ei = 4

{((

Page 29: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

בדיקת איזון סוגריים באמצעות מחסנית

input: a((b{c})[d])ei = 5

{((

Page 30: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

בדיקת איזון סוגריים באמצעות מחסנית

input: a((b{c})[d])ei = 6

((

Page 31: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

בדיקת איזון סוגריים באמצעות מחסנית

input: a((b{c})[d])ei = 7

(

Page 32: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

בדיקת איזון סוגריים באמצעות מחסנית

input: a((b{c})[d])ei = 8

[(

Page 33: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

בדיקת איזון סוגריים באמצעות מחסנית

input: a((b{c})[d])ei = 9

[(

Page 34: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

בדיקת איזון סוגריים באמצעות מחסנית

input: a((b{c})[d])ei = 10

(

Page 35: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

בדיקת איזון סוגריים באמצעות מחסנית

input: a((b{c})[d])ei = 11

Page 36: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

בדיקת איזון סוגריים באמצעות מחסנית

input: a((b{c})[d])ei = 12

Page 37: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

בדיקת איזון סוגריים באמצעות מחסנית

input: a((b{c})[d])ei = 13

Page 38: בשחמה יעדמל אובמ - BGU · 2014-03-20 · הלוכמ. הילע םינותנ לשהלוכמ אוה םינותנה הנבמ ןורקיעב• תולועפ םיעצבמ

בדיקת איזון סוגריים באמצעות מחסניתpublic static boolean checkBalanced(String input) {

Stack st = new StackAsArray();

for (int i = 0; i < input.length(); i = i + 1) {char c = input.charAt(i);if (c == '(' || c == '[' || c == '{')st.push(c);

else if (c == ')' || c == ']' || c == '}')if (st.isEmpty() || !matches((Character) st.pop(), c))

return false;}return st.isEmpty();

}

public static boolean matches(char c1, char c2) {return c1 == '(' && c2 == ')' || c1 == '[' && c2 == ']' || c1 == '{' && c2 == '}';

}