โครงสร้างข้อมูล“ ล่วงล้ำ” หมายความว่าอย่างไร


120

ฉันเคยเห็นคำว่าล่วงล้ำใช้เพื่ออธิบายโครงสร้างข้อมูลเช่นรายการและสแต็ก แต่มันหมายความว่าอย่างไร

คุณสามารถยกตัวอย่างรหัสของโครงสร้างข้อมูลที่ล่วงล้ำได้และแตกต่างจากโครงสร้างที่ไม่ล่วงล้ำอย่างไร

นอกจากนี้เหตุใดจึงทำให้เป็นการล่วงล้ำ (หรือไม่ล่วงล้ำ) มีประโยชน์อย่างไร? มีข้อเสียอย่างไร?

คำตอบ:


107

โครงสร้างข้อมูลที่ล่วงล้ำคือโครงสร้างที่ต้องการความช่วยเหลือจากองค์ประกอบที่ตั้งใจจะจัดเก็บเพื่อจัดเก็บ

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

ตัวอย่างเช่นคุณสามารถสร้างต้นไม้ไบนารีที่ไม่ล่วงล้ำโดยที่แต่ละโหนดมีการอ้างอิงถึงต้นไม้ย่อยด้านซ้ายและด้านขวาและการอ้างอิงถึงค่าองค์ประกอบของโหนดนั้น

หรือคุณสามารถสร้างสิ่งที่ล่วงล้ำโดยที่การอ้างอิงถึงแผนผังย่อยเหล่านั้นฝังอยู่ในค่านั้นเอง

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

ระบบ ORM มักจะวนเวียนอยู่กับโครงสร้างข้อมูลที่ล่วงล้ำเพื่อลดการวนซ้ำในรายการวัตถุขนาดใหญ่ ตัวอย่างเช่นหากคุณดึงรายชื่อพนักงานทั้งหมดในฐานข้อมูลจากนั้นเปลี่ยนชื่อของพนักงานคนใดคนหนึ่งและต้องการบันทึกกลับไปที่ฐานข้อมูลรายชื่อพนักงานที่ล่วงล้ำจะถูกแจ้งให้ทราบเมื่อวัตถุของพนักงานเปลี่ยนไปเนื่องจากว่า วัตถุรู้ว่าอยู่ในรายการใด

จะไม่มีการบอกรายการที่ไม่ล่วงล้ำและจะต้องค้นหาว่ามีอะไรเปลี่ยนแปลงและเปลี่ยนแปลงไปอย่างไรด้วยตัวของมันเอง


8
ฉันยังคงต้องการดูตัวอย่างและข้อดีข้อเสีย แต่นี่เป็นคำแนะนำที่ดี
Rudiger

แทนที่จะโพสต์รหัสฉันจะบอกว่า STL ไม่ล่วงล้ำในขณะที่ Boost การล่วงล้ำเป็นการล่วงล้ำ (ชัด ๆ )
stonemetal

1
ข้อดีที่ล่วงล้ำ: ไม่จำเป็นต้องคัดลอกข้อมูลของคุณลงในโครงสร้างภายในก็สามารถใช้ได้ตามที่เป็นอยู่ จุดด้อย: คุณต้องทำลายการห่อหุ้มข้อมูลของคุณเพื่อรองรับคอนเทนเนอร์ที่ข้อมูลของคุณกำลังจะถูกจัดเก็บอาจเป็นเรื่องยุ่งยากหากข้อมูลของคุณต้องอยู่ในหลายคอนเทนเนอร์ คอนเทนเนอร์ไม่ล่วงล้ำข้อดี: การห่อหุ้มที่ดีขึ้นไม่จำเป็นต้องแก้ไขข้อมูลสำหรับคอนเทนเนอร์ของคุณ จุดด้อย: ต้องใช้สำเนาข้อมูลของคุณไปยังโครงสร้างโหนดภายใน
stonemetal

3
boost.org/doc/libs/1_45_0/doc/html/intrusive.htmlมีตัวอย่างและคำอธิบายข้อดีข้อเสียที่ดี
Tony Delroy

5
คำอธิบายที่ดีพร้อมตัวอย่าง: boost.org/doc/libs/1_55_0/doc/html/intrusive/…
Paweł Szczur

22

ในคอนเทนเนอร์ที่ล่วงล้ำข้อมูลเองมีหน้าที่จัดเก็บข้อมูลที่จำเป็นสำหรับคอนเทนเนอร์ นั่นหมายความว่าในด้านหนึ่งประเภทข้อมูลจะต้องมีความเชี่ยวชาญขึ้นอยู่กับว่าจะจัดเก็บอย่างไรในอีกด้านหนึ่งหมายความว่าข้อมูล "รู้" ว่าจัดเก็บอย่างไรจึงสามารถปรับให้เหมาะสมได้ดีกว่าเล็กน้อย

ไม่ล่วงล้ำ:

template<typename T>
class LinkedList
{
  struct ListItem
  {
    T Value;
    ListItem* Prev;
    ListItem* Next;
  };

  ListItem* FirstItem;
  ListItem* LastItem;

  [...]
  ListItem* append(T&& val)
  {
    LastItem = LastItem.Next = new ListItem{val, LastItem, nullptr};
  };
};

LinkedList<int> IntList;

ล่วงล้ำ:

template<typename T>
class LinkedList
{
  T* FirstItem;
  T* LastItem;

  [...]
  T* append(T&& val)
  {
    T* newValue = new T(val);
    newValue.Next = nullptr;
    newValue.Prev = LastItem;
    LastItem.Next = newValue;
    LastItem = newValue;
  };
};

struct IntListItem
{
  int Value;
  IntListItem* Prev;
  IntListItem* Next;
};

LinkedList<IntListItem> IntList;

โดยส่วนตัวแล้วฉันชอบการออกแบบที่ล่วงล้ำเพื่อความโปร่งใส


บรรทัดสุดท้ายนั้นเป็นที่น่าสงสัยเกี่ยวกับการใช้คำว่า "โปร่งใส" เนื่องจากการอยู่ในคอนเทนเนอร์ที่ล่วงล้ำทำให้วัตถุไม่โปร่งใส
เลื่อน

@ArtB เป็นที่ชัดเจนในการถ่ายทอดวิธีการใช้ข้อมูลอย่างถูกต้องในแอปพลิเคชันขั้นสุดท้ายในกรณีของข้อมูลที่ไม่ล่วงล้ำคุณมักจะต้องขุดลงในคอนเทนเนอร์ในขณะที่ข้อมูลล่วงล้ำคุณจะเห็นจากโครงสร้างของข้อมูลเพียงอย่างเดียว
API-Beast

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

2
@ArtB อ๋อ! วิทยาศาสตร์คอมพิวเตอร์มีความหมายพิเศษสำหรับความโปร่งใส! วิธีการที่โปร่งใสสำหรับฉันที่คุณสามารถมองเห็นภายในได้เช่น "ไม่กีดขวางมุมมอง" เช่นคำที่ใช้ในบริบทใด ๆ ที่ไม่ใช่ cs
API-Beast
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.