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

Post on 17-Jul-2020

4 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

מבני נתונים

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

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

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

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

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

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

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

כליםארגז

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ADTשל מערך

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

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

ADTשל מערך ב-Java

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

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

}

מימוש מערך בעל קיבולת קבועה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; }

}

מימוש מערך בעל קיבולת משתנה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;

}}

}

בעל קיבולת משתנהנוסף למערך מימוש 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() { … }

}

ADTשל קבוצה

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

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

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

}

קבוצה באמצעות מערךמימוש 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; }

מימוש קבוצה באמצעות מערך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;

}}

מימוש קבוצה באמצעות מערך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);

}}

}

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

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

public class EfficientSet extends SetAsArray {

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

}

}

ADTשל מחסנית

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

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

}

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

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

arr

nElements

מימוש מחסנית באמצעות מערך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;

}}

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

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));

}

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;

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

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

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

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

(

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

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

((

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

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

((

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

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

{((

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

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

{((

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

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

((

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

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

(

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

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

[(

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

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

[(

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

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

(

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

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

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

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

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

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

בדיקת איזון סוגריים באמצעות מחסנית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 == '}';

}

top related