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


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|m−xi|.
δ(m+1)−δ(m)
δ(m+1)−δ(m)=∑i=1n{+1m≥xi−1m<xi=#{i:m≥xi}−#{i:m<xi}.
m−∞+∞δ(m+1)−δ(m)−nnx1,…,xnmδ(m+1)−δ(m)≥0ximin(δ(x1),…,δ(xn))

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


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

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

5

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

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

min∑|ai−x|

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

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

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

min∑ai′

ภายใต้:

' ฉัน ≤ ฉัน - x ∀ ฉัน' ฉัน , x ' ≥ 0 ∀ ฉัน

ai′≥ai−x ∀i
ai′≤ai−x ∀i
ai′,x′≥0 ∀i

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


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

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

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