วิธีการหาซูเปอร์สตาในเวลาเชิงเส้น?


28

พิจารณากราฟกำกับ เราเรียกโหนดซุปเปอร์สตาร์และถ้าหากไม่มีโหนดอื่น ๆ ที่สามารถเข้าถึงได้จากมัน แต่โหนดอื่น ๆ ทั้งหมดที่มีขอบสระโวลต์ อย่างเป็นทางการ:v v

v  superstar :⟺outdeg(v)=0indeg(v)=n1

ด้วยจำนวนโหนดในกราฟ ตัวอย่างเช่นในกราฟด้านล่างโหนดที่ไม่สำเร็จเป็นซูเปอร์สตาร์ (และโหนดอื่นไม่ได้)n

ซุปเปอร์สตาร์
[ แหล่งที่มา ]

คุณจะระบุซุปเปอร์สตาร์ทั้งหมดในกราฟที่กำกับในเวลาอย่างไร? เป็นตัวแทนของกราฟที่เหมาะสมสามารถเลือกจากผู้สมัครตามปกติ ; โปรดงดเว้นจากการใช้การเป็นตัวแทนซึ่งย้ายความซับซ้อนของปัญหาไปสู่การประมวลผลล่วงหน้าO(n)

ไม่มีสมมติฐานเกี่ยวกับความหนาแน่น เราไม่คิดว่ากราฟมีซูเปอร์สตาร์ หากไม่มีเลยอัลกอริทึมควรจดจำมัน

โน้ต : เป็นจำนวนโหนดขอบขาออกฉันn d อีกรัมคล้ายกันสำหรับขอบขาเข้าoutdegindeg


1
เราได้รับอนุญาตให้โดยที่kเป็นขอบหรือเราจำเป็นต้องดูเฉพาะO ( 1 )ขอบในแต่ละจุดยอด? O(n+k)kO(1)
Kevin

O(n)

O(n)

@DaveClarke: ใช่และใช่
กราฟิลส์

คุณควร จำกัด การเป็นตัวแทนเพิ่มเติม อัลกอริทึมเชิงเส้นเป็นไปไม่ได้สำหรับรายการ adjacency (เพียงเพื่อยืนยันว่าจุดสุดยอดเป็นซุปเปอร์สตาร์คุณอาจต้องผ่านรายการทั้งหมดในแต่ละจุดสุดยอด)
Gilles 'หยุดความชั่วร้าย'

คำตอบ:


18

n1xyxyyx

vertex superstar(graph g)
    current vertex = first
    # Go through each vertex
    for each subsequent vertex in g ("next")
        # If there's an edge from this to the next, we eliminate this one [move to the new one].
        # If not, we just stay here.
        if edge exists from current to next
            candidate = next
        end if
    end for
    # Now we are on the final remaining candidate, check whether it satisfies the requirements.
    # just a rename for clarity
    candidate = current
    for each other vertex in g
        if edge from current to other exists
            return null 
        else if no edge from other to current
            return null
        end if
    end for
    return candidate
end superstar

ลองทำตัวอย่างเพื่ออธิบายวิธีการ ใช้อาร์เรย์นี้พร้อมกับจุดสุดยอดของแหล่งที่มาด้านบนและปลายทางด้านข้าง 1 หมายถึงขอบ:

12341101210131114110

ฉันจะทำให้จุดสีเทาที่เราตัดออกไปเป็นซุปเปอร์สตาร์ที่มีศักยภาพ ฉันจะใช้สีเขียวและสีแดงเพื่อบ่งบอกถึงขอบที่เรากำลังมองหาเมื่อพวกเขาทำและไม่ได้มีขอบที่เรากำลังมองหาและสีฟ้าเพื่อระบุตำแหน่งที่เราได้ดูแล้ว

เราเริ่มต้นด้วยการดูจุดยอด 1 และ 2

12341101210131114110

12341101210131114110

เราเห็นว่าไม่มีขอบดังนั้นเราจึงกำจัด 1 และใช้ 3 เป็นจุดยอดปัจจุบันของเรา จำได้ว่าเราได้กำจัด 2 ไปแล้วดังนั้นดูว่ามีขอบจาก 4 เป็น 3:

12341101210131114110

มีขอบตั้งแต่ 4 ถึง 3 ดังนั้นเราจึงกำจัด 4 ณ จุดนี้เราได้กำจัดทั้งหมดยกเว้นหนึ่งในจุดยอด (3) ดังนั้นตรวจสอบขอบและดูว่ามันมีคุณสมบัติ:

12341101210131114110

มีขอบตั้งแต่ 1 ถึง 3 แต่ไม่ใช่กลับกันดังนั้น 3 จึงยังเป็นตัวเลือก

12341101210131114110

นอกจากนี้ยังมีขอบตั้งแต่ 2 ถึง 3 แต่ไม่ใช่กลับกันดังนั้น 3 จึงยังคงเป็นตัวเลือก

12341101210131114110

มีขอบตั้งแต่ 4 ถึง 3 แต่ไม่ใช่ 3 ถึง 4; ที่ทำให้การตรวจสอบขอบ 3 ของเราเสร็จสมบูรณ์และเราพบว่าแท้จริงแล้วมันคือซุปเปอร์สตาร์

n1nnn12×(n1)3n3O(n)Θ(n)


8

นี่ไม่ใช่ปัญหาชื่อเสียงหรือไม่

จะมีซูเปอร์สตาร์เพียงคนเดียว (คนดัง) ถ้ามี

A[i,j]=1ij0

A[i,j]O(1)A[i,j]=1iA[i,j]=0j

รักษารายชื่อผู้สมัครปัจจุบันโดยกำจัดทีละคน รายการที่เชื่อมโยงควรเพียงพอ

ในตอนท้ายคุณสามารถตรวจสอบว่าผู้สมัครของคุณเป็นซุปเปอร์สตาร์จริงๆ

O(n)


(i,j)

3
@ ราฟาเอล: เพียงเลือกผู้สมัครสองคนแรกจากรายการที่เชื่อมโยง (หัวและหัว -> ถัดไป)
Aryabhata

6

คำตอบนี้ตอบคำถามของรุ่นที่สามารถแสดงกราฟได้ แต่ไม่ใช่เวอร์ชันปัจจุบันของคำถาม

  • จัดเก็บกราฟของคุณเป็นคู่ของรายการคำสรรพนามและรายการคำสรรพนามย้อนกลับซึ่งแต่ละรายการจะมีความยาวของรายการเพิ่มขึ้นด้วยดังนั้นจึงมีหมายเลขที่อยู่นอกและอยู่ในขอบตามลำดับ

  • O(|E|)

  • 0n1O(|N|)


ตกลงฉันเห็นว่าการอนุญาตให้แสดงกราฟใด ๆนั้นอ่อนเกินไป ฉัน จำกัด คำถามตามที่ตั้งใจไว้
กราฟิลส์

2

สำหรับการอ้างอิงนี่เป็นรหัสเทียมของรุ่นเรียกซ้ำของสิ่งที่ Kevin โพสต์

superstar(V, E) {
  if ( |V| == 1 ) {
    return V.pop
  }

  a = V.pop
  b = V.pop
  if ( (a,b) ∈ E ) {
    no_ss = a
    keep  = b
  }
  else {
    no_ss = b
    keep = a
  }

  s = superstar(V ++ keep)

  return ( s != null && (no_ss, s) ∈ E && !(s, no_ss) ∈ E ) ? s : null
}

hasSuperstar(V, E) = superstar(V, E) != null
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.