อัลกอริทึมเพื่อจับคู่ตัวเลขที่มีจำนวนการเคลื่อนไหวน้อย


11

นี่เป็นคำถามเกี่ยวกับการแก้ไขระยะทางและเป็นเรื่องง่ายมาก ฉันแค่สมองค่อนข้างตายในเรื่องนี้และไม่สามารถคิดออก


รับชุดตัวเลขเช่น

[3, 1, 1, 1]

คนเราจะเปลี่ยนตัวเลขทั้งหมดให้เป็นตัวเลขเดียวกันได้อย่างมีประสิทธิภาพมากที่สุดอย่างไรด้วยจำนวน "การเคลื่อนไหว" ขั้นต่ำ โดย "ย้าย" หมายถึงการเพิ่มหรือลบออกจากตัวเลข

ในตัวอย่างข้างต้นการเคลื่อนไหวที่มีประสิทธิภาพมากที่สุดคือ:

[1, 1, 1, 1]

สิ่งนี้จะต้องมี 2 การเคลื่อนไหวลดจำนวนแรกสองครั้ง

ฉันไม่สามารถหาวิธีที่ดีที่สุดในการค้นหาสิ่งนี้ได้เนื่องจากมีอาร์เรย์ที่ใหญ่กว่าของตัวเลขนับร้อย

ตอนแรกฉันพยายามคำนวณจำนวนเฉลี่ยที่ถูกปัดเศษ (ผลรวมของหารด้วยความยาวทั้งหมด) จากนั้นลดลงเป็นค่าเฉลี่ยที่คำนวณ แต่ตัวอย่างข้างบนแตกนี้ต้องใช้การเคลื่อนที่ 4 ครั้งแทน 2

ฉันคิดว่าฉันสามารถคิด:

  1. เฉลี่ย,
  2. โหมด
  3. ค่ามัธยฐาน

และรับระยะทางแก้ไขของแต่ละคนเลือกระยะทางขั้นต่ำ อย่างไรก็ตามฉันไม่แน่ใจว่าสิ่งนี้จะถูกต้องในทุก ๆ ครั้งเดียว ฉันจะรู้ได้อย่างไร


หากโดเมนมีจำนวน จำกัด คุณสามารถลองความเป็นไปได้ทั้งหมดตั้งแต่ขั้นต่ำถึงสูงสุด มิฉะนั้นคุณอาจลองใช้โหมดหรือค่ามัธยฐาน
Bartosz Przybylski

ขอบคุณ @Bartek ดูเหมือนว่าความพยายามที่เป็นไปได้ทั้งหมดจะไม่มีประสิทธิภาพอย่างมากหากต้องรับมือกับตัวเลขหลายร้อยหรือหลายพัน ฉันจะตรวจสอบโหมด / ค่ามัธยฐาน แต่สิ่งเหล่านี้แน่นอนที่จะสร้างผลลัพธ์ในทุก ๆ กรณี? นั่นเป็นคำถามหลักของฉัน ฉันกำลังมองหาอัลกอริทึมที่แน่นอนและมีประสิทธิภาพ
dthree

ตัวเลขต้องอยู่ในชุดของตัวเลขหรือเป็นจำนวนเต็มหรือไม่?
TCSGrad

@TCSGrad มันอาจเป็นจำนวนเต็มใด ๆ แต่เห็นได้ชัดว่าคุณต้องการเลือกอย่างใดอย่างหนึ่งที่อยู่ระหว่างนาทีและจำนวนสูงสุด ในกรณีนี้ทั้งแบบ 1, 2 หรือ 3
dthree

คำตอบ:


10

คำตอบคือใช้ค่ามัธยฐาน หนึ่งในคุณสมบัติของค่ามัธยฐานคือมันลดระยะทาง L1 ให้น้อยที่สุดสำหรับแต่ละองค์ประกอบ (เพื่อให้เข้าใจถึงบทความ Wikipedia ให้ใช้การแจกแจงความน่าจะเป็นการแจกแจงแบบเดียวกันกับชุดตัวเลขดั้งเดิมของคุณ)

นี่คืออัลกอริทึมที่แก้ปัญหา (แต่เดิมเขียนโดยdc2 ):

function median(arr) {
  arr.sort(function(a, b) { return a - b; });
  var half = floor(arr.length/2);
  if ( arr.length % 2 ) {
    return arr[half];
  } else {
    return (arr[half-1] + arr[half]) / 2.0;
  }
}

function minl1(arr) {
  var moves = 0;
  var mdn = median(arr);
  for ( var i = 0; i < arr.length; ++i ) {
    moves += Math.abs(mdn - arr[i]);
  }
  return moves;
}

minl1([3, 1, 1, 1]); // -> 2

ใช่มันทำเช่นนั้น ตลกวิธีการทำงาน ดูเหมือนว่าคนมัธยฐานจะทำเช่นนั้น แต่เดี๋ยวก่อน ขอบคุณมาก.
dthree

1
ดูคำตอบของฉันสำหรับการพิสูจน์
Yuval Filmus

@ dc2: คุณไม่สามารถ "ทำให้แน่ใจ" โดย "ลองใช้งาน"
กราฟิลส์

1
เพียงที่จะต้องทราบ: คุณสามารถคำนวณเวลามัธยฐาน O (n)
Bartosz Przybylski

1
@ ราฟาเอลมันโอเคที่จะรวมรหัสของ OP ในคำตอบอื่น ๆ โดยไม่มีการอ้างอิงถึง OP?
thefourtheye

10

x1,,xnm

δ(m)=i=1n|mxi|.
δ(m+1)δ(m)
δ(m+1)δ(m)=i=1n{+1mxi1m<xi=#{i:mxi}#{i:m<xi}.
m+δ(m+1)δ(m)nnx1,,xnmδ(m+1)δ(m)0ximin(δ(x1),,δ(xn))

สมมติว่าทั้งหมดนั้นแตกต่างกันและนั้นแปลก ขอเป็นค่ามัธยฐานของx_iจากนั้นในขณะที่และนั้นเป็นค่าที่ไม่ซ้ำกัน ถ้าเป็นเช่นนั้นการคำนวณที่คล้ายกันแสดงว่าเราสามารถเลือกจุดใดก็ได้ในช่วงเวลาที่เชื่อมต่อค่ามัธยฐาน การให้เหตุผลที่คล้ายคลึงกัน แต่มีความละเอียดมากกว่านี้แสดงให้เห็นว่าค่ามัธยฐานใด ๆ นั้นเหมาะสมแม้ว่าจะไม่แตกต่างกัน ดังนั้นมีจริงต้องคำนวณไม่มีในทุกx_ixinmxiδ(m+1)δ(m)=1δ(m)δ(m1)=1mnxiδxi


คุณอาจพลาด แต่คำตอบนี้ (เกือบ) พิสูจน์ว่าค่ามัธยฐานเป็นตัวเลือกที่ดีที่สุด
Yuval Filmus

1
คำตอบของคุณยอดเยี่ยมและฉันก็ลงมือทำ น่าเสียดายสำหรับฉันเล็ก ๆ น้อย ๆ ที่ยอดเยี่ยมเกินไปเพราะฉันไม่ได้มีความเชี่ยวชาญด้านสัญกรณ์วิทยาศาสตร์ นั่นคือปัญหาของฉันไม่ใช่ของคุณ
dthree

5

ปัญหาสามารถกำหนดเป็นปัญหา LP ได้:

ให้ชุดตัวเลขแก้ LP ต่อไปนี้:n[a1,a2...an]

min|aix|

(ลบข้อ จำกัด ในซึ่งไม่จำเป็นเพราะราฟาเอลชี้ให้เห็น)x

เมื่อ LP ได้รับการแก้ไขแล้วคุณจะได้รับค่าสอดคล้องกับโซลูชัน ถ้า เป็นจำนวนเต็มแสดงว่าคุณเสร็จแล้ว - อื่นให้ปัดเศษเป็นจำนวนเต็มที่ใกล้ที่สุดxx

แก้ไข : ตามที่ระบุไว้ในความคิดเห็นฟังก์ชั่นวัตถุประสงค์ควรมีผลรวมมากกว่าความแตกต่างแน่นอน เพื่อที่จะแปลงมันกลับไปเป็น LP มาตรฐานเราสามารถเขียน LP ใหม่เป็น:

minai

ภายใต้:

' ฉันฉัน - x ฉัน' ฉัน , x '0 ฉัน

aiaix i
aiaix i
ai,x0 i

ที่ทางออกที่ดีที่สุด , และเราสามารถหาค่าของจากคำตอบได้xai=|aix| ix


ดังนั้นถ้าฉันเข้าใจสิ่งนี้อย่างถูกต้องในตัวอย่างของฉัน x จะเป็น 1 - 3 และดังนั้นฉันจะหาระยะการแก้ไขของ 1, 2 และ 3 แล้วทำขั้นต่ำได้ไหม
dthree

@ dc2: นี่จะลดผลรวมของระยะทางระหว่างแต่ละหมายเลขกับโดยที่คือหมายเลขลู่เข้า ข้อ จำกัด ทำให้มั่นใจได้ว่า LP จะสิ้นสุดลงอย่างรวดเร็วและไม่ค้นหาจำนวนเต็มทั้งหมด! xxx
TCSGrad

ทำไมข้อ จำกัด จึงจำเป็น?
Raphael
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.