נניח שנרצה להכפיל שתי מטריצות מגודל ולקבל את מטריצת המכפלה כאשר
האלגוריתם הנאיבי כמובן הוא לחשב את המכפלה לפי הנוסחה לכל בזמן ריצה .
לאורך ההסטורייה הצליחו לחסום את בעיית כפל המטריצות בזמנים נמוכים יותר ויותר . נסמן את החזקה של שתהווה את החסם לאלגוריתם כפל המטריצות ב . ובאופן כללי נסמן את זמן הריצה של כפל מטריצות ב תחת ההבחנה שלא יתאפשר כי חייבים לעבור על המטריצות לפחות פעם אחת לצורך החישוב.
מספר חסמים שכדאי להכיר שקיימים-
A) נאיבי:
B) סטרסן:
C) קופרסימת ווינוגראד:
D) סתות׳רס:
E) ואסילבסקה וויליאמס:
F) לה-גאל:
הגדרת FMM
אלגוריתם כפל מטריצות עם זמן עבור נקרא FMM - כפל מטריצות מהיר.
בעיית כפל מטריצות בוליאניות BMM קלט: מטריצות בוליאניות מגודל פלט: כאשר
כמובן שאת בעיה זו ניתן לפתור בעזרת FMM בזמן . נרצה להראות מספר בעיות שניתן לפתור עם FMM ועם BMM
הערה חשובה
הרבה מאלגוריתמי FMM הם אינם מעשיים כיוון שהם משתמשים בטכניקות מתמטיות מורכבות כמו הפחתת משוואות לצורכי ייעול הזמן הנאיבי של כפל מטריצות. כאן נכנס לתמונה אלגוריתמים קומבינטוריים שאינם משתמשים בשיטות אלו . המונח אלגוריתם קומבינטורי לא מוגדר היטב ונתייחס אליו כאלגוריתם שלא משתמש בטכניקות הנ״ל .
האלגוריתם הקומבינטורי המהיר ביותר כרגע לבעיית BMM רץ בזמן של שלפי סדרי גודל זה ״איטי״ יותר מ כאשר . השערה: לא קיים אלגוריתם קומבינטורי שפותר את BMM בזמן כאשר .
אחת הבעיות שנפתור כאן, בעיית זיהוי המשולשים תשתמש ב BMM ונראה שכל ייעול של האלגוריתם הזה ישפר גם את זמן הריצה של BMM בסתירה להשערתנו וכך בעצם קישרנו בין שתי אלגוריתמים שלכאורה הם שונים בתכליתם.
הגדרה:
סימון שמתעלם מכל פקטור פולינומי בזמן הריצה למשל
זיהוי משולשים בגרף
הגדרת משולש בגרף
משולש בגרף לא מכוון הוא מעגל לא מכוון באורך 3 קשתות
בעיית זיהוי המשולשים קלט: גרף לא מכוון שמיוצג על ידי מטריצת שכנויות פלט: האם מכיל משולש או לא.
הפתרון של הבעיה טמון במשפט הבא:
עבור המטריצה , המחושבת על ידי BMM , האלכסון הראשי ב מכיל 1 אמ״מ מכיל משולש.
הוכחה:
נניח שהאלכסון הראשי ב מכיל , וצריך שקיים משולש ב
אם כן קיים כלשהו כך ש כלומר
כלומר קיים עבורו
ולכן כל אחד מהגורמים הנ״ל הוא , וגם ולכן קיים כשלהו עבורו
התוצאה היא שקיבלנו 3 קשתות כלומר הקשתות שזה בעצם משולש.
נניח שב יש משולש
נסמנו . המשמעות היא שב מתקיים
נסמן : ומהנוסחה שפתחנו עבור ההוכחה הקודמת יתקיים .
הוכחה כללית יותר
נוכל להוכיח את הטענה באופן כללי יותר - תהי מטריצת מטריצת שכנויות עבור
אזי, במטריצה המחושבת על ידי BMM יתקיים שב אמ״מ קיים מסלול מ ל באורך
רעיון ההוכחה יהיה להראות על את הדרוש (נובע ישירות מהגדרת הכפל הבוליאני) ולהתייחס לזה ואל עצמה כבסיס האינדוקצייה (שכן מטריצת שכנויות מראה את כל המסלולים באורך אחד מ ל ) , לאחר מכן כצעד האינדוקצייה ניקח את ויתקיים כלומר לפי כפל מטריצות בוליאני והנחת האינדוקצייה , יתקיים שאנחנו בודקים האם ישנו קודקוד כלשהו שמחבר בין הדרושים כאשר נתייחס ל כאינדקס המייצג את השורה במטריצה כלומר לקחנו מסלול מאורך בין ל וסך הכל בודקים אם ניתן לחבר את ה הזה לקודקוד . כמובן שאם מתקיים משמעות הדבר היא שיש מעגל באורך לקודקוד
באופן דומה נוכל להוכיח שאם נעלה מטריצה בחזקת בכפל רגיל נקבל את מספר המסלולים באורך מ קודקוד ל עבור איבר
משפט:
אם ניתן לפתור את בעיית זיהוי המשולשים קומבינטורית בזמן אז ניתן לפתור את בעיית בזמן .
זה הקשר שהזכרתי בתחילת הסיכום שאמרתי שנסתכל עליו שתמיד יעמוד בסתירה להנחה שלא ניתן לפתור את בעיית BMM בזמן .
הוכחה:
קודם כל , נראה דרך שבהינתן אלגוריתם קומבינטורי שפותר בעיית זיהוי משולשים בגרף , אז ניתן לנצל את זה ולבנות אלגוריתם שפותר BMM.
אם כן בהינתן שתי מטריצות מגודל נרצה לחשב את בעיית המכפלה כאשר הכפל בוליאני.
לאחר מכן, ננתח זמן ריצה ונראה שבעיית זיהוי המשולשים משפיעה על זמן הריצה של גרף זה.
נבנה גרף תלת צדדי (כלומר גרף שהקשתות הן רק בין הקבוצות שנגדיר כמו ב גרף דו צדדי) כאשר
נגדיר את הקשתות באופן הבא
במילים איפה שיש במטריצה נבנה קשת בין ל ואיפה שיש ב יש קשת בין ל ונוסיף את כל הקשתות האפשריות בין ל . נשים לב שיש לנו קודקודים ו קשתות.
לדוגמה- עבור המטריצות
הגרף שיווצר יהיה
לשם חלק מהוכחות נשתמש בצבעים האלה תמיד בקונבצייה לייצוג קשת מסויימת בין צדדים. למשל מ ל זה תמיד יהיה כחול.
כעת נוכיח טענת עזר ומשם ניגש לניסיונות שלנו להוכיח את הטענה הנ״ל-
למה
עבור ו הקשת משתתפת במשולש אמ״מ .
הוכחה:
משולש הוא קשת אדומה, כחולה, ירוקה.
ניקח קשת אדומה כלשהי (כי אלו מתקיימות תמיד מהגדרת קשתות אלו), לכן שאר הקשתות במשולש צריכות להיות ירוקה אחת וכחולה אחת.
הכחולה אומרת שתא ב שווה ל נניח שהתא הוא ובגרף זאת הקשת ובאופן דומה, הירוקה אומרת שתא ב הוא . אם התא הזה הוא בגרף זאת תהיה הקשת ויש לנו משולש. כמו כן כפי שמוגדר כפל מטריצות בוליאני אז
לכן הוכחנו את שתי הצדדים, אם יש משולש בגרף בהכרח ערך המתאים ב יהיה .
קונבנצייה
קל יותר לרשום משולש בגרף הנ״ל כ במקום כיוון שנתון מהגדרה שתמיד יש קשת בין ל .
ניסיון 1
נראה ראשית, איך מחשבים את מטריצת המכפלה דרך שימוש באלגוריתם זיהוי משולשים בגרף.
BMM(A,B)
create G = (IxJxK, E) from A,B
C = new matrix[n,n] = {0,0}
while G contains triangle (i_t,j_l,k_p)
C[t,p] = 1
delete (i_t, k_p) from G
מחיקת הקשת מבטיחה שתמיד נשבור משולש שהיה בגרף וככה לא נחזור על משולשים פעמיים והאלגוריתם חייב להגמר מתישהו.
הוכחת נכונות:
נשווה את מתוצאת הכפל הנאיבי ונראה שהאלגוריתם אכן ימקם את הערך המתאים לאיבר זה.
נניח שהנ״ל ערכו מהלמה שהוכחנו אנחנו יודעים ש משתתפת במשולש , כיוון שהשתמשו בזיהוי משולשים כקופסה שחורה ומניחים את נכונותו הרי שהאלגוריתם יזהה אותו ויציב וימחק את הקשת הזאת.
אם אז מהלמה הנ״ל הקשת לא שייכת למשולש , האלגוריתם לא יזהה את הקשת הזאת כחלק מהמשולש ולא ישנה את ערכה.
בעיות מהאלגוריתם
ישנן שתי בעיות עיקריות שעולות מהאלגוריתם הנ״ל
הראשונה, היא העובדה שאנחנו תיארנו אלגוריתם שמחזיר true אם יש משולש ו false אם לא. לא תיארנו אלגוריתם שמחזיר את הקשת עצמה כדי שנוכל להשתמש בה כמו שעשינו. ניתן באופן נאיבי לבנות אלגוריתם בזמן שמחזיר משולש במידה והוא מוצא כזה.
השנייה, היא זמן הריצה , אנחנו מבצעים איטרציות לזיהוי משולשים בגרף זאת כיוון שמקרה קצה יש משולש לכל וכיוון שכל משוייך לכל בגרף יש קשתות כאלו. סך הכל יתקיים שזמן הריצה הכולל של האלגוריתם עבור הגרף שלנו עם קודקודים יהיה
שזה זמן גדול בהרבה מהזמן הנאיבי ולכן לא הראנו כלום.
ניסיון 2
הרעיון יהיה לבצע מעין הפרד ומשול של הגרף.
נחלק את ל תתי חלוקות כשבכל תת חלוקה קודקודים
נשים לב שיש לנו שלישיות אפשריות ועליהן נריץ את האלגוריתם מהניסיון הראשון.
BMM(A,B)
create G = (IxJxK, E) from A,B
C = new matrix[n,n] = {0,0}
divide I,J,K to t sub sets. (each sub group will have n/t vertex)
for each (I_x, J_y, K_z)
while sub graph of those vertex containg edges (i_t, j_l, k_p)
C[t,p] = 1
delete (i_t,k_p) from G
הוכחה נכונות:
לפני שבכלל נבדוק מיהו שיאפשר זמן ריצה אופטימלי. נוכיח שאכן התוצאה בסוף של נכונה ותהיה שקולה לכפל המטריצות הנאיבי.
בדומה להוכחה הקודמת אם ניקח שלישייה משלישייה כך שהיא מייצרת משולש בגרף אז אנחנו יודעים בוודאות שהקשת לא נמחקה והיא כעת תמחק באיטרצייה של השלישייה הנ״ל לאחר שתבוצע ההשמה . לאחר מכן הקשת תמחק ולא נוכל יותר לזהות משולש עם הקשת גם אם נרוץ על שלישייה שמכילה את בתוכה.
זמן ריצה:
נרצה לספור כמה פעמים האלגוריתם קורא לזיהוי משולשים בגרף מגודל (גודל של שלישייה אחת).
מספר ההשמות במטריצה הוא לכל היותר כגודל המטריצה.
מספר הפעמים שבהם לא נזהה משולש הוא לכל היותר כיוון שכל פעם שלא מוצאים משולש מיד עוברים לשלשה חדשה.
סך הכל מספר הפעמים שמפעילים את האלגוריתם לזיהוי משולשים הוא .
נסמן ב להיות זמן הריצה לאלגוריתם זיהוי משולשים על גרף עם קודקודים וזמן הריצה של כל האלגוריתם שלנו יהיה:
כלומר עבור נקבל זמן ריצה
APSP על גרף לא מכוון ולא משוקלל
אנחנו מכירים דרכים לפתרון בעיית APSP על גרפים מכוונים ומשוקללים וכמובן שניתן לפתור באמצעותם את הבעייה הנ״ל , שכן היא מקרה פרטי של המקרים שכבר פתרנו. אבל אם נתון לנו שהגרף לא מכוון ולא משוקלל נוכל לפתור את הבעיה במספר דרכים יעילות בינהן אלגוריתם של סיידל שמאפשר לפתור את הבעייה באמצעות כפל מטריצות מהיר.
הבחנה
כפי שכבר הראנו, ניתן באמצעות BFS לפתור את בעיית הAPSP עבור גרף מכוון או לא מכוון כל עוד אין פונקציית משקלים. ולכן אם אנחנו יודעים שהגרף לא ממושקל אבל לא יודעים אם הוא מכוון או לא מכוון נוכל להריץ BFS מכל קודקוד מקור ולקבל זמן ריצה
הגדרה: קלט- גרף קשיר, לא מכוון , לא ממושקל וללא קשתות כפולות שמיוצג על ידי מטריצת שכנויות . פלט- לכל נחשב את המסלול הקצר ביותר (במספר הקשתות) בין ל .
נשים לב- שהגדרנו שהגרף קשיר בלי הגבלת הכלליות, אחרת פשוט נריץ את אותו אלגוריתם על כל רכיב קשירות בנפרד, בנוסף במטריצת השכנויות במקרה הזה האלכסון הראשי מכיל רק אפסים כי אין קשתות עצמיות.
כדי להתחיל לבנות את האלגוריתם, נגדיר גרף חדש
המיוצג על ידי מטריצת השכנויות
המשמעות של היא ש כלומר, במטריצת יהיה במיקום אם ורק אם יש מסלול באורך 2 מ קודקוד לקודקוד או שהקודקוד ה והקודקוד ה הם שכנים. זה נובע מההבחנה שעשינו בתחילת הסיכום ש מייצג את התכנות המסלולים באורך בין שתי קודקודים בגרף.
בגלל שהגרף המקורי הוא קשיר ולא מכוון, הרי שב יהיו איברים באלכסון שערכם יהיה כיוון שאם יש מסלול באורך 2 מ ל בגרף אז בהכרח גם יש מסלול באורך מ ל . תחת ההבחנה הזאת נשים לב שבגלל שבגרף שמיוצג על ידי אסור שיהיו לולאות עצמיות, נדאג לאפס את איברי האלכסון שלו.
הקשתות של הגרף יהיו
כלומר בנוסף לכל הקשתות שיש ל , הגרף יבנה קשת נוספת בין כל הקודקודים שבגרף היה בהם מסלול מאורך 2.
טענה אורך המסלול הקצר ביותר בין בגרף שקול לחצי מעוגל כלפי מעלה של המסלול הקצר ביותר בינהם בגרף .
הוכחה:
נסמן את המסלול הקצר ביותר מ ל בגרף
נחלק למקרים-
א) כלומר . מההגדרה, ב יש את המסלול כלומר מסלול באורך קשתות.
אם כן , נניח בשלילה ש מסלול זה אינו הקצר ביותר ב מ ל כלומר קיים מסלול אחר שהוא מינימלי כלומר . מהגדרת הקשתות בגרף אנחנו יודעים שב יש מסלול שמתאים ל עם מספר קשתות שקול או לכל היותר בסתירה למינימליות של .
כלומר הוא מסלול קצר ביותר ב מ ל ויתקיים
ב) כלומר לפי הגדרת קיים מסלול בגרף זה כל ש כלומר מסלול עם קשתות. נניח בשלילה שהוא אינו המסלול הקצר ביותר וקיים קצר יותר. כלומר ולכן יש ב מסלול מתאים ב עם לכל היותר בסתירה למינימליות של . כלומר
האלגוריתם הבא פותר את בעיית APSP לגרפים לא מכוונים ולא ממושקלים.
נסמן כמטריצת המרחקים הסופית של ובאופן שקול כמטריצת המרחקים הסופים של
seidel_generic(A):
if A is all 1 except for the diagonal
return A
𝚫' = seidel_generic(A*A V A)
for u,v in V
if 𝚫[u,v] is odd
𝚫[u,v] = 𝜹(u,v) = 2𝜹'(u,v)-1
else
𝚫[u,v] = 𝜹(u,v) = 2𝜹'(u,v)
return 𝚫
נסביר, האלגוריתם בונה כל פעם מטריצה חדשה עד אשר תנאי הבסיס שבו יש קשת ישירה מכל קודקוד בגרף מתקיים (כיוון שהגרף קשיר אנחנו נבצע את הפעולה הזאת לכל היותר פעמים) ולאחר מכן יורדים בחזרה כאשר אנחנו מפרקים אחורנית את ערך המסלול הקצר ביותר לפי המשפט שהראנו למעלה.
נשים לב שבדקנו האם המרחק הקצר ביותר בין שתי קודקודים הוא זוגי או אי זוגי מבלי לחשב אותו כלל, איך עשינו זאת?
יש 4 מקרים עבור הזוגיות של ו א) כלומר הם שקולים מודולו 2. המשמעות של זה היא ששניהם זוגיים או אי זוגיים ביחד ובהכרח יתקיים שיוויון בינהם (כיסינו 2 מקרים).
הסיבה היא-
שאם שניהם זוגיים נסמן ו ולפי מה שרשמנו למעלה
המספר השלם היחיד שנמצא בין ל הוא ולכן ולכן המרחקים שווים.
באופן דומה אם שניהם אי זוגיים נקבל ש
וההסבר שקול למה שעשינו במקרה הזוגי הוא המספר השלם היחיד שנמצא בין שתי מספרים אלו.
נשים לב שהמשמעות של תרחיש זה היא ש אינו במסלול הקצר ביותר מ ל ובאופן דומה אינו במסלול הקצר ביותר מ ל . זה נובע מאי שיוויון המשולש .
ב) אם זוגי ו אי זוגי:
כלומר
ג) אם אי זוגי ו זוגי:
כלומר
הבחנה
אם הוא שכן של במסלול הקצר ביותר וגם הוא אי זוגי.
אז האי שיוויון הוא ממש כלומר:
הסיבה שזה נכון היא שאנחנו יודעים ש ובגלל ש אי זוגי אז זוגי ולכן
הגדרה: נסמן ב את הקודקודים השכנים של ב . נשים לב-
טענה
הוכחה : זוגי ולכן לכל שכן של יתקיים זוגי או אי זוגי כלומר ממה שהוכחנו
נוכיח לפי הcontra positive של הטענה. נניח אי זוגי כלומר ממה שהוכחנו למעלה אנחנו יודעים שהמקרים שמתאפשרים על שכן הוא ש כלומר
רק נשאר להסביר למה האי שיוויון הזה הוא חזק כלומר במקום צריך להיות הסיבה לכך היא שכפי שאמרנו בהבחנה שלנו עבור השכן שהוא חלק מהמסלול הקצר ביותר יתקיים אי שיוויון חלש כלומר כל הסכום הזה יהיה קטן ממש ולא קטן או שווה ולכן האי שיוויון חלש וזה מוכיח את הcp של הטענה שלנו.
אם כן אנחנו יכולים לקבוע את הזוגיות של מסלול קצר ביותר מבלי לחשב אותו ישירות בעזרת ערכי שלו . מטרתנו כעת היא להבין איך מחשבים את הגורמים הרלוונטים לקביעת הזוגיות באופן יעיל.
א) על מנת לחשב את דרגת הקודקוד עלינו לסרוק את שורת המטריצה של כלומר יעלה לנו זמן.
אם כן, חישוב הדרגה לכל הקודקודים הוא . סך הכל בהינתן נוכל לחשב את הביטוי בזמן לכל קודקודי הגרף.
ב) כדי לחשב את נגדיר את המטריצה (הכפל הוא רגיל ולא בוליאני). נוכיח ש
הוכחה -
האלגוריתם של סיידל
אם כן מצאנו דרך לחשב את שתי הביטויים הדרושים כדי לקבוע זוגיות של מסלול קצר ביותר מבלי לחשב את ערכו. סך הכל האלגוריתם של סיידל ייראה כך
seidel(A):
if A is all 1 except for the diagonal
return A
𝚫' = seidel(A*A V A)
M = 𝚫'* A
for u,v in V
if M[u,v] < deg(v)𝚫'[u,v]
𝚫[u,v] = 2𝚫'[u,v]-1
else
𝚫[u,v] = 2𝚫'[u,v]
return 𝚫
זמן ריצה
אם אורך המסלול הארוך ביותר בגרף הוא , אז צריך איטרציות לפני שנגיע למקרה הבסיס במקרה הגרוע . בנוסף לכל יש את העבודה המקומית שהיא ביצוע כפל מטריצות מהיר FMM וחישוב דרגות כל קודקודי הגרף. זמן העבודה המקומית הוא
כי כפי שאמרנו בהכרח. ביחד עם הקריאה הריקורסיבית והתייחסות לעומק עץ הריקורסייה זמן הריצה יהיה
גרף קליק
הגדרה לתנאי העצירה שלנו נקראת גרף קליק, כלומר גרף מכוון שמכיל את כל הקשתות לדוגמה
במצב זה, מטריצת השכנויות תהיה מטריצה שכל האיברים הם פרט לאיברי האלכסון שכן אין קשתות עצמיות (זה אינטואיטיבית הגיוני כי כולם שכנים של כולם).