בעיית הסכומים החלקיים

במדעי המחשב, בעיית הסכום החלקי (Subset Sum Problem) היא בעיה חשובה בתורת הסיבוכיות ובקריפטוגרפיה. הבעיה היא כזו: בהינתן קבוצה של מספרים שלמים, האם קיימת תת-קבוצה לא ריקה שלה שסכום איבריה הוא אפס? לדוגמה, בהינתן הקבוצה {7-,3-,2-,8,5} כקלט לבעיה, התשובה תהיה חיובית, והקבוצה שסכומה אפס תהיה {2-,3-,5}. בעיה זו היא NP-שלמה.

בעיה שקולה לבעיה זו היא כדלקמן: בהינתן קבוצת מספרים שלמים I, ומספר נוסף s, האם קיימת תת-קבוצה לא ריקה של I שסכום איבריה הוא s?

ניתן גם לחשוב על בעיית הסכום החלקי כעל מקרה מיוחד של בעיית תרמיל הגב.[1] מקרה מיוחד של בעיה זו היא בעיית החלוקה, בה נשאלת השאלה האם קיימת תת-קבוצה שסכום איבריה שווה לסכום כל האיברים שאינם בתת-קבוצה זו.

אלגוריתמים לפתרון הבעיה

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

אלגוריתם לפתרון בזמן אקספוננציאלי

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

קיים גם אלגוריתם טוב יותר שרץ בזמן שהוצג לראשונה על ידי הורוביץ וסהני בשנת 1972. האלגוריתם פועל באופן הבא:

  1. נחלק את הקלט לקבוצות T ו-U בגודל כל אחת.
  2. נחשב את הקבוצות A ו-B כאשר A היא קבוצת כל הזוגות הסדורים כך ש- הוא קידוד של בחירת איברים ב-T שסכומם הוא ובאותו אופן B היא קבוצת הזוגות עבור U.
  3. נמיין את A ו-B בסדר עולה.
  4. נחפש זוג ו- כך שמתקיים .

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

  1. נסמן
  2. אם , נסמן
  3. אחרת, אם עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle a_i + b_j < s} , נסמן עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle i = i+1}
  4. אחרת, נחזיר את איחוד הקבוצות המקודדות על ידי ו-

אלגוריתם לפתרון בזמן פסאודו פולינומי

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

הפתרון לבעיה הזו משתמש בתכנון דינמי. נניח שהקלט הוא מהצורה עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle X_1 , ... , X_n} , ועלינו לבדוק האם קיימת תת-קבוצה שסכום איבריה הוא אפס. יהא A הסכום של כל האיברים השליליים בקבוצה, ויהא B הסכום של כל האיברים החיוביים בה.

נגדיר את הפעולה הבוליאנית להיות התשובה לשאלה: "האם קיימת תת-קבוצה של עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle X_1 , ... , X_i} שסכום איבריה הוא s". ברור כעת כי פתרון הבעיה הוא עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle Q(n,0)} .

נבחין כי עבור עיבוד הנוסחה נכשל (שגיאת המרה. השרת ("https://en.wikipedia.org/api/rest_") השיב: "Cannot get mml. Server problem."): {\displaystyle A>s,s>B} מתקיים . כעת, ניצור טבלה בגודל עיבוד הנוסחה נכשל (שגיאת המרה. השרת ("https://en.wikipedia.org/api/rest_") השיב: "Cannot get mml. Server problem."): {\displaystyle n*(B-A)} , כאשר הערך בנקודה (i,j) יהיה עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle Q(i,A+j)} , ונמלא את הטבלה מלמטה למעלה ומשמאל לימין באמצעות הרקורסיה הבאה:

  • מקרה הבסיס: עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle Q(1,s) := (x_{1}==s)}
  • עבור : עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle Q(i,s) := Q(i-1,s) or (x_{i} == s) or Q(i-1,s-x_{i})}

מילוי כל תא לוקח זמן עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle O(1)} כי ערכי הטבלה שהוא משתמש בהן בפסוק הלוגי ידועים כבר מחישובים קודמים, ולכן זמן מילוי הטבלה יהיה עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle O(n*(B-A))} .

הפתרון לא נחשב פולינומי בתורת הסיבוכיות כיוון שהערך עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle B-A} אינו פולינומי בגודל הבעיה, שהוא מספר הביטים שדרוש כדי לייצג אותם. האלגוריתם הוא פולינומי בערכים של ושל עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle B} , שהם אקספוננציאלים במספר הביטים שלהם.

אלגוריתם קירוב בזמן פולינומי

אלגוריתם קירוב לבעיית הסכום החלקי הוא כדלהלן: בהינתן קבוצת מספרים עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle X_1 , ... , X_n} , מספר s, ומספר c>0 כלשהו, נרצה שהפלט יהיה:

  • "לא", אם לא קיימת תת-קבוצה שמסתכמת למספר בין לעיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle s} .
  • "כן", אחרת.

אם כל המספרים הם לא שליליים, ניתן לפתור זאת בזמן פולינומי ב- וב-עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \frac{1}{c}} .

נשים לב שבבעיה המקורית, אם כל סכום אפשרי של מספרים יכול להיכתב באמצעות P ביטים, אם נפתור את הבעיה המקורית באלגוריתם הקירוב עם עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle c=2^{-P}} , נפתור את הבעיה בדיוק. לכן אלגוריתם זה הוא פתרון מדויק של הבעיה כשהוא רץ בזמן פולינומי ב- וב-עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle 2^{P}} (כלומר, אקספוננציאלי ב-עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle P} ).

האלגוריתם המקורב לבעיה הוא:

initialize a list S to contain one element 0.
 for each i from 1 to n do
   let T be a list consisting of xi + y, for all y in S
   let U be the union of T and S
   sort U
   make S empty 
   let y be the smallest element of U 
   add y to S 
   for each element z of U in increasing order do
      //trim the list by eliminating numbers close to one another
      //and throw out elements greater than s
     if y + cs/n < z ≤ s, set y = z and add z to S 
 if S contains a number between (1 − c)s and s, output yes, otherwise no

האלגוריתם רץ בזמן פולינומי כיוון שהרשימות S,T,U תמיד בגודל פולינומי ב-n וב-עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \frac{1}{c}} , ולכן גם כל הפעולות שנעשות עליהן מתבצעות בזמן פולינומי. גודל הרשימות אכן נשאר פולינומי היות שאנו מוסיפים עצמים ל-S אם הם גדולים מהעצם הקודם ב-עיבוד הנוסחה נכשל (שגיאת המרה. השרת ("https://en.wikipedia.org/api/rest_") השיב: "Cannot get mml. Server problem."): {\displaystyle {\frac {cs}{n}}} וקטנים מ-. הצעד שמוודא שההפרש בין כל שני עצמים שמתווספים הוא לפחות עיבוד הנוסחה נכשל (שגיאת המרה. השרת ("https://en.wikipedia.org/api/rest_") השיב: "Cannot get mml. Server problem."): {\displaystyle {\frac {cs}{n}}} מוודא שברשימה יש לכל היותר עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \frac{n}{c}} עצמים.

האלגוריתם נכון כיוון שבכל צעד מתווספת שגיאה של לכל היותר עיבוד הנוסחה נכשל (שגיאת המרה. השרת ("https://en.wikipedia.org/api/rest_") השיב: "Cannot get mml. Server problem."): {\displaystyle {\frac {cs}{n}}} , ובמהלך שלבים מתווספת שגיאה של לכל היותר עיבוד הנוסחה נכשל (שגיאת המרה. השרת ("https://en.wikipedia.org/api/rest_") השיב: "Cannot get mml. Server problem."): {\displaystyle cs} .

ראו גם

לקריאה נוספת

הערות שוליים

  1. Martello, Silvano; Toth, Paolo (1990). "4 Subset-sum problem". Knapsack problems: Algorithms and computer interpretations. Wiley-Interscience. עמ' 105–136. ISBN 0-471-92420-2. MR 1086874. 
This article is issued from Hamichlol. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.