מחפש מבנה נתונים

Guy Yafe

New member
מחפש מבנה נתונים

נתונה רשימה של ערכים (סדר גודל של מאות אלפים) הערכים הם מסוג double אבל זה לא מאוד משנה. כל ערך ממופה על ידי מפתח שמורכב מארבעה עצמים:
Key<A, B, C, D> -> Value<Double>
המטרה היא שבהינתן מפתח שמורכב מארבעה עצמים, אוכל לשלוף את הערך המתאים בצורה מהירה. הפתרון הוא כמובן טבלת גיבוב שממפה מהמפתח לערך.
לאחר מכן קיבלתי הוראה לאפשר חיפוש עם מפתחות שמכילים * כלומר בהינתן המפתח K<A1, B1, C1, *> z (התעלמו מה-z) אמצא את כל הערכים שהמפתחות שלהם מורכבים מהעצמים A1, B1, C1 ומכל D אפשרי.
זו הייתה בקשה מהPL שהחשיבה שלו היא SQL-ית במקור.
ידוע לי שיש מעט מאוד אפשרויות לערכי A ו-B שונים, יש המון אפשרויות לערכי C ואילו ב99 אחוז מהמקרים ה-* יהיה על D בלבד.
פיתרון שחשבתי עליו הוא מיפוי כפול: קודם כל על ידי C ולאחר מכן על ידי כל המפתח. כך בהינתן מפתח אני אצמצם את האפשרויות בכל שאגש רק למפה שנמצאת בתא של C וממנה אבחר את כל העצמים עם A וB נתונים.

השאלה שלי היא האם יש פיתרון יותר יעיל מבחינת סיבוך?

אשמח לעצות,
גיא
 

Grosseto

New member
אם זו בעיה לעולם האמיתי

אז פשוט תכין טבלה SQLית עם שני שדות, האחד DOUBLE והשני ליטרלי בגודל 4

ואז בשאילה פשוטה עם ביטוי רגולרי אפשר לשלוף בקלות ובמהירות
select DOUBLE_VALUE from TAB where key REGEXP AB?F
אתה יכול למשל להשתמש ב SQLITE
 

Guy Yafe

New member
המידע נמצא רק בזיכרון.

המקור שלו הוא אכן מבסיס נתונים SQLServer, אבל אני מחפש משהו שיישב בזיכרון.
חשבתי על איזשהו In Memory SQL, אבל קיבלתי הוראה לא להוסיף framework חיצוניים. ("אילוצי מערכת")
 

Grosseto

New member
SQLITE יושב בזכרון

זה קיים בילד אין בכל סמרטפון אנדרואיד
 

Guy Yafe

New member
sqlite מיועד לשמירת מידע פרסיסטנטי

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

Grosseto

New member
כמובן לכולנו יש מגבלות ודרישות


אבל רק לידע כללי לכל מי שמעוניין, יש אפשרות לפתוח עם ":memory:"
ואז הכל נעשה בזכרון
 

Guy Yafe

New member
השאלה אם זה ייתן יעילות גבוהה יותר

נניח שאצור טבלה בבסיס נתונים, אתן לה אינדקס על פי C ואז אצור שאילתות SQL.
בסופו של דבר אני אקבל זמן ריצה וזיכרון דומים למה שכבר יש לי?
 

Grosseto

New member
אני יודע שבחברת סקייפ משתמשים בזה

אם זה טוב להם זה טוב לכל אחד אחר
אלא אם כן אתה מיירט טילים שאין לי מושג בדברים האלה
 

פרסאוס

New member
אני לא יכול לייעץ לגבי סיבוך

היות וזה עניין אינדבידואלי (אולי התכוונת לסיבוכיות?) אבל לא מזמן היה לי פרוייקט
שכל חישוב בו לקח נצח (40 שניות, לפעמים יותר - ללקוח ווב בקצה). לבד מהחלפת השפה
החלטתי על החלפת האלגוריתם. בניתי עץ, לא בינארי אלא אם תרצה טרינארי. זה אולי משהו שיעזור לך
כאן למרות שלפי ההסבר שלך קצת קשה לתפוס מה בדיוק הולך שם.
הרעיון הוא שערכים ממוינים לפי יותר מגורם אחד (תחשוב על זה כעץ שיש בו גם עומק).
יחד עם שילוב של ריסק מסויים, זמן הפתרון לבעיה התקצר משמעותית במקרה שלנו (פי 10K בערך...).
חיפוש בעץ שכזה הוא מסובך יותר כי אתה צריך לשקלל את הגורמים לפי אלגוריתם ולא פשוט לפי גדול קטן,
אבל לנו זה מאוד עזר.
 

Guy Yafe

New member
כמובן שהכוונה לסיבוכיות.

טעות שלי. אם יש לך רפרנס למאמר על מה שעשית (אלא אם זה היה פנימי לחלוטין), אשמח לראות.
 

פרסאוס

New member
לצערי אין לי זמן לעדכן את האתר שלי

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

selalerer

New member
אם הזמן שלוקח לבנות את האינדקס הוא לא מוגבל, בנה עוד אינדקס.

תוכל לבנות אינדקס מדורג:
אינדקס ל-A, בתוך כל A אינדקס ל-B, בתוך כל B אינדקס ל-C ובתוך כל C אינדקס ל-D.
&nbsp
באופן כללי, תוכל לבנות אינדקסים מראש לפי סוגי השאילתות שאתה יודע שיש.
&nbsp
&nbsp
 

Guy Yafe

New member
נבחר - KDTree

תודה לעונים על העצות ועל ההכוונה.
חיפשתי את המושגים שהראיתם לי באינטרנט ומצאתי שKD-Tree כנראה הכי מתאים לעבודה שלי.
 
למעלה