חיפוש במערך ממוין-סיבובית

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

לצורך השאלה, נגדיר חלוקה פנימית של המערך לארבעה רביעים בגודל n/2 x n/2, ממוספרים מ-1 עד 4 באופן הבא:

 01
012
143

נאמר שהמערך הוא סיבובי (circular) אם כל האיברים ברביע 1 קטנים ממש מכל אלו שברביע 2, אלו שברביע 2 קטנים ממש מכל אלו שברביע 3, ואלו שברביע 3 קטנים ממש מכל אלו שברביע 4. למשל, המערך הבא הוא סיבובי:

 01
015
197

לשם הנוחות, נגדיר גם כל מערך בגודל 1×1 כמערך סיבובי. נאמר שמערך בגודל n×n הוא ממוין-סיבובית (circular sorted) אם הוא סיבובי, ארבעת הרביעים שלו הם סיבוביים, וכן הלאה עד לרביעים בגודל 1×1. לדוגמה, המערך הבא ממוין-סיבובית:

 0123
01379
1641511
236502122
360553026
13
64
79
1511
3650
6055
2122
3026
 
 
13
64
<
79
1511
  ∧
3650
6055
>
2122
3026
 
 
21<22
  ∧
30>26

עליכם לכתוב שיטת חיפוש בינארית למימוש החיפוש במערך ממוין-סיבובית. השיטה מקבלת כפרמטרים את מערך דו-ממדי mat הוא ממוין-סיבובית, וערך לחיפוש num. אם הערך num נמצא במערך mat, השיטה יוחזר true ויודפסו מספר השורה ומספר העמודה שבהם נמצא המספר num. אם הערך num לא נמצא במערך mat, יוחזר false ולא יודפס כלום.

לדוגמה, אם mat הוא המערך המוצג לעיל, ו-num = 22 יוחזר הערך true ויודפסו השורות הבאות:

row = 2
col = 3

אם mat הוא המערך המוצג לעיל, ו-num = 23 יוחזר הערך false ולא יודפס כלום.

השיטה צריכה להיות יעילה ככל הניתן, גם מבחינת סיבוכיות הזמן וגם מבחינת סיבוכיות המקום.

אילוצים:

המערך mat אינו null והוא ממוין-סיבובית.

דוגמה 1:
קלט:
mat =
[[1, 3, 7, 9],
 [6, 4, 15, 11],
 [36, 50, 21, 22],
 [60, 55, 30, 26]],
num = 15
פלט:
row = 1
col = 2
true

הסבר: המספר 15 נמצא במערך במיקום שורה 1, עמודה 2.

דוגמה 2:
קלט:
mat =
[[1, 3, 7, 9],
 [6, 4, 15, 11],
 [36, 50, 21, 22],
 [60, 55, 30, 26]],
num = 100
פלט:
false

הסבר: המספר 100 לא נמצא במערך.

דוגמה 3:
קלט:
mat =
[[1, 2],
 [4, 3]],
num = 3
פלט:
true

הסבר: המספר 3 נמצא במערך במיקום שורה 1, עמודה 0.

דוגמה 4:
קלט:
mat =
[[1, 3, 7, 9],
 [6, 4, 15, 11],
 [36, 50, 21, 22],
 [60, 55, 30, 26]],
num = 6
פלט:
row = 1
col = 0
true

הסבר: המספר 6 נמצא במערך במיקום שורה 1, עמודה 0.

Loading...
נשמרLn 1, Col 1

קלט:

mat =
[[1, 3, 7, 9],
 [6, 4, 15, 11],
 [36, 50, 21, 22],
 [60, 55, 30, 26]],
num = 15

הפלט המבוקש:

row = 1
col = 2
true