יום ראשון, 4 בספטמבר 2016

שיטות ספירה

אנחנו רגילים לעבוד עם מספרים עשרוניים אך מערכות דיגיטליות עובדות עם ו- . לכן עבודה עם מספרים בינאריים או מספרים בבסיס הקסדצימלי נוחה יותר.


ייצוג עשרוני

מספרים עשרוניים בנויים כך שלכל עמודה במספר יש משקל פי מהעמודה מימינה. לכן נאמר שמספרים עשרוניים הם בבסיס . נכתוב מספרים עם הייצוג לבסיס שלהם כך: הוא המספר בבסיס . לכל ספרה במספר בבסיס יש טווח של מספרים, בין ל- , לכן קיימות אפשרויות למספר עשרוני בעל ספרות.


ייצוג בינארי

ביט מייצג אחד מ- רכים אפשריים, או . צירוף כלשהו של מספר ביטים מרכיב מספר בינארי. לכל עמודה במספר בינארי יש משקל פי מהעמודה מימינה. לכל ספרה במספר בבסיס יש טווח של מספרים, או , לכן קיימות אפשרויות למספר בינארי בעל ספרות.


מעבר מבסיס ל-

נכפיל כל ספרה במשקל שלה ונחבר. משקל הספרה הכי שמאלית הוא הבסיס בחזקת אפס, משקל הספרה משמאלה הוא הבסיס בחזקת , וכך הלאה עד שהגענו לספרה הכי ימנית.


מעבר מבסיס ל-

נחלק את המספר העשרוני ב- והשארית היא ספרה המתאימה לכל עמודה מימין לשמאל בייצוג הבינארי.
למשל , נחלק ב- ונקבל לכן הספרה הכי שמאלית היא . נחלק את ב- ונקבל בלי שארית, לכן הספרה אחרי היא . נחלק את ונקבל , לכן הספרה הבאה היא . נחלק את ונקבל לכן הספרה הבאה היא . נחלק את ונקבל , ולכן הספרה הבאה היא . נחלק את ב- ונקבל שהספרה האחרונה היא . סך הכל קיבלנו שהייצוג הבינארי של הוא .


ייצוג הקסדצימלי

מספרים בינאריים נוטים להיות ארוכים, כמו בדוגמא האחרונה מספר דו-סיפרתי בבסיס הופך למספר בעל ספרות בבסיס , . קבוצה של ביטים מייצגת אחת מ- אפשרויות. לכן לפעמים יותר נוח לעבוד בבסיס .
מספרים הקסדצימליים משתמשים בספרות עד ובנוסף באותיות עד . בדומה לבסיסים הקודמים לכל עמודה יש משקל פי מהעמודה מימינה.


מעבר מבסיס ל-

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


מעבר בסיס כללי לבסיס

השיטה שהראינו למעבר מבסיס ל- , עובדת עבור כל בסיס. מייצג את הבסיס ו- מייצג ספרה .


מספרים ממשיים

באופן דומה נוכל להעביר כל מספר עשרוני בבסיס כלשהו לבסיס , רק שעבור ספרות אחרי הנקודה החזקה יורדת מימין לשמאל.


חיבור בינארי

חיבור בינארי הוא בדיוק כמו החיבור הרגיל שאנחנו מכירים רק שאנחנו עוברים במרחב בעל מספרים, ו- .
מספרים יותר מורכבים:
כמו בחיבור רגיל כשאנחנו מקבלים מספר דו-סיפרתי נעביר את ספרת העשרות לעמודה השמאלית.
מערכות דיגיטליות עובדות עם מספר קבוע של ביטים ולכן יכול להיווצר מצב בו חיבור שני מספרים בינאריים יתן לנו תוצאה לא נכונה. נניח שאנחנו משתמשים במערכת בעלת טווח של ביטים, נקבל ברור שהתוצאה לא נכונה משום ש- שווה ל- ולא לאפס.

יום שבת, 3 בספטמבר 2016

מיון הכנסה - Insertion Sort

מיון הכנסה (Insertion sort) הוא אלגוריתם יעיל למיון מספר קטן של איברים.
מקור:https://en.wikipedia.org/wiki/File:Insertion-sort-example-300px.gif


המיון עובד כפי שרובנו ממיינים קלפים באופן טבעי. נניח וקיבלנו 6 קלפים רנדומליים ואנחנו רוצים למיין אותם בסדר גודל עולה. משמאל לימין נסתכל על הקלף שני ונשווה אותו לקלף הראשון, אם הוא קטן ממנו אז נשים אותו משמאלו, אם לא אז נמשיך לקלף הבא. את הקלף השלישי נשווה לקלפים משמאלו עד שנמצא קלף קטן ממנו ושים אותו מימינו. וכך הלאה עד שנגיע לקלף השישי.

קלט: סדרה בעלת $n$ מספרים $\left(a_{1},a_{2},\ldots,a_{n}\right)$.

פלט: סדרה בעלת $n$ מספרים $\left(a_{1}',a_{2}',\ldots,a_{n}'\right)$ כך שמתקיים $a_{1}'\le a_{2}'\le\cdots\le a_{n}'$.



מקור: https://en.wikipedia.org/wiki/File:Insertion_sort.gif

הוכחת נכונות

בתחילת כל איטרציה של לולאת ה-for, שהאינדקס שלו הוא $i$, תת-מערך $\text{num_array}\left[0:i-1\right]$ מכיל קלפים שמויינו, ושאר האיברים בתת-מערך $\text{num_array}\left[i+1:n\right]$ הם הקלפים שבאים אחרי קלף $i$ שעוד לא מויינו. ובפרט האיברים במערך $\text{num_array}\left[0:i-1\right]$ הם אותם איברים שהיו באינדקסים 0 עד $i-1$ לפני שהתחלנו למיין, נגדיר את התכונה הזאת של תת המערך $\text{num_array}\left[0:i-1\right]$ כשמורת לולאה.

שמורת לולאה:
בתחילת כל איטרציה של לולאה ה-for, תת-מערך $\text{num_array[0:i-1]}$ מורכב מאיברים שבמקור היו בתת המערך אך בסדר ממויין.

נשתמש בשמורת הלולאה כדי להוכיח את נכונות האלגוריתם. נצטרך להראות שלושה דברים:
  • שמורת הלולאה נכונה לפני האיטרציה הראשונה של הלולאה:
    • כאשר $i=1$, תת המערך $\text{num_array}[0:i-1]$ מורכב רק מאיבר אחד, $\text{num_array}[0]$. הוא ממויין ומכיל רק איברים מ-$\text{num_array}[0]$, ולכן שמורת הלולאה מתקיימת.
  • אם שמורת הלולאה נכונה לפני איטרציה של הלולאה, אז היא נכונה גם לפני האיטרציה הבאה.
    • עבור $i$ כלשהו, הלולאה מזיזה את כל האיברים באינדקס הקטן מ-$i$ צעד אחד ימינה ($+1$) עד שנמצא מקום מתאים ל-$\text{num_array}[i]$. לכן תת המערך $\text{num_array}[0:i]$ מכיל רק את האיברים המקוריים שהיו ב-$\text{num_array}[0:i]$, רק בצורה ממויינת. ולכן איטרציה של הלולאה משמרת את שמורת הלולאה.
  • כאשר הלולאה מסתיימת, שמורת הלולאה נותנת לנו תכונה שימושית שעוזרת להוכיח את נכונות האלגוריתם.
    • התנאי שעוצר את הלולאה הוא $i > \text{len(num_array)}$, משום שהלולאה מגדילה את $i$ ב-$1$ כל איטרציה בהכרח נגיעה ל-$i=\text{len(num_array)}+1$. לפי שמורת הלולאה תת המערך $\text{num_array}[0:i-1]$ מורכב מאיברים שבמקור היו בתת המערך אך בסדר ממויין, ולכן  $\text{num_array}[0:\text{len(num_array)}]$ מערך ממויין.

זמן ריצה


במקרה הטוב ביותר
בממוצע
במקרה הגרוע
$O(n)$
$O\left(n^{2}\right)$
$O\left(n^{2}\right)$