กลับไปหน้าบทความ

อ่าน 6 นาที

อัลกอริทึมของ Freivalds

อัลกอริธึมการคูณเมทริกซ์/ทฤษฎีเมทริกซ์/อัลกอริธึมแบบสุ่ม

อัลกอริทึมของ Freivalds (ตั้งชื่อตามRūsiņš Mārtiņš Freivalds ) เป็นอัลกอริทึมแบบสุ่มเชิง ความน่าจะเป็น ที่ใช้ในการตรวจสอบการคูณเมทริกซ์ โดยกำหนดเมทริกซ์ขนาดn × nสามเมทริกซ์...

อัลกอริทึมของ Freivalds

อัลกอริทึมของ Freivalds (ตั้งชื่อตามRūsiņš Mārtiņš Freivalds ) เป็นอัลกอริทึมแบบสุ่มเชิง ความน่าจะเป็น ที่ใช้ในการตรวจสอบการคูณเมทริกซ์ โดยกำหนดเมทริกซ์ขนาดn × nสามเมทริกซ์  เอ{\displaystyle A},บี{\displaystyle B}, และซี{\displaystyle C}ปัญหาทั่วไปประการหนึ่งคือการตรวจสอบว่าเอ×บี=ซี{\displaystyle A\times B=C}อัลกอริทึมแบบง่ายๆจะคำนวณผลคูณเอ×บี{\displaystyle A\times B}ระบุอย่างชัดเจนและเปรียบเทียบทีละข้อว่าผลิตภัณฑ์นี้เท่ากับหรือไม่ซี{\displaystyle C}อย่างไรก็ตามอัลกอริทึมการคูณเมทริกซ์ที่เป็นที่รู้จักดีที่สุดนั้นทำงานด้วยโอ(n2.372){\displaystyle O(n^{2.372})}เวลา อัลกอริทึมของ Freivalds ใช้การสุ่มเพื่อลดขอบเขตเวลาดังกล่าวลงโอ(n2){\displaystyle O(n^{2})}[ 1 ]ด้วยความน่าจะเป็นสูงในโอ(เคn2){\displaystyle O(kn^{2})}เวลาที่อัลกอริธึมสามารถตรวจสอบผลคูณเมทริกซ์ได้ด้วยความน่าจะเป็นของความล้มเหลวน้อยกว่า2เค{\displaystyle 2^{-k}}.

อัลกอริทึม

ป้อนข้อมูล

เมทริกซ์ n × nสามเมทริกซ์  เอ{\displaystyle A},บี{\displaystyle B}, และซี{\displaystyle C}.

เอาต์พุต

ใช่ ถ้าเอ×บี=ซี{\displaystyle A\times B=C}ไม่ อย่างอื่นก็ไม่เกี่ยว

ขั้นตอน

  1. สร้างเวกเตอร์สุ่ม 0/1 ขนาด n × 1  {\displaystyle {\vec {r}}}.
  2. คำนวณพี=เอ×(บี)ซี{\displaystyle {\vec {P}}=A\times (B{\vec {r}})-C{\vec {r}}}.
  3. แสดงผล "ใช่" ถ้าพี=(0,0,,0)ที{\displaystyle {\vec {P}}=(0,0,\ldots ,0)^{T}}"ไม่" ถ้าไม่ใช่แบบนั้น

ข้อผิดพลาด

ถ้าเอ×บี=ซี{\displaystyle A\times B=C}ถ้าเช่นนั้น อัลกอริทึมจะส่งคืนค่า "ใช่" เสมอเอ×บีซี{\displaystyle A\times B\neq C}ดังนั้น ความน่าจะเป็นที่อัลกอริทึมจะส่งคืน "ใช่" จึงน้อยกว่าหรือเท่ากับครึ่งหนึ่ง นี่เรียกว่า ข้อผิดพลาด ด้านเดียว

โดยการทำซ้ำอัลกอริทึมkครั้ง และส่งคืนค่า "ใช่" ก็ต่อเมื่อการทำซ้ำทั้งหมดให้ผลลัพธ์เป็น "ใช่" เท่านั้น จะทำให้เวลาในการทำงานเป็นโอ(เคn2){\displaystyle O(kn^{2})}และความน่าจะเป็นของข้อผิดพลาดของ1/2เค{\displaystyle \leq 1/2^{k}}บรรลุผลสำเร็จแล้ว

ตัวอย่าง

สมมติว่าเราต้องการตรวจสอบว่า:

เอบี=[2334][1012]=?[6587]=ซี.{\displaystyle AB={\begin{bmatrix}2&3\\3&4\end{bmatrix}}{\begin{bmatrix}1&0\\1&2\end{bmatrix}}{\stackrel {?}{=}}{\begin{bmatrix}6&5\\8&7\end{bmatrix}}=C.}

เลือกเวกเตอร์แบบสุ่มที่มีสององค์ประกอบ โดยแต่ละองค์ประกอบมีค่าเท่ากับ 0 หรือ 1 สมมติว่าเป็น เวกเตอร์นี้ =[11]{\displaystyle {\vec {r}}={\begin{bmatrix}1\\1\end{bmatrix}}} และใช้ในการคำนวณ:

เอ×(บี)ซี=[2334]([1012][11])[6587][11]=[2334][13][1115]=[1115][1115]=[00].{\displaystyle {\begin{aligned}A\times (B{\vec {r}})-C{\vec {r}}&={\begin{bmatrix}2&3\\3&4\end{bmatrix}}\left({\begin{bmatrix}1&0\\1&2\end{bmatrix}}{\begin{bmatrix}1\\1\end{bmatrix}}\right)-{\begin{bmatrix}6&5\\8&7\end{bmatrix}}{\begin{bmatrix}1\\1\end{bmatrix}}\\&={\begin{bmatrix}2 &3\\3&4\end{bmatrix}}{\begin{bmatrix}1\\3\end{bmatrix}}-{\begin{bmatrix}11\\15\end{bmatrix}}\\&={\begin{bmatrix}11\\15\end{bmatrix}}-{\begin{bmatrix}11\\15\end{bmatrix}}\\&={\begin{bmatrix}0\\0\end{bmatrix}}.\end{aligned}}}

ผลลัพธ์ที่ได้คือเวกเตอร์ศูนย์ ซึ่งบ่งชี้ถึงความเป็นไปได้ที่ AB = C อย่างไรก็ตาม หากในการทดลองครั้งที่สอง เวกเตอร์=[10]{\displaystyle {\vec {r}}={\begin{bmatrix}1\\0\end{bmatrix}}}หากเลือกตัวเลือกนี้ ผลลัพธ์ที่ได้จะเป็นดังนี้:

เอ×(บี)ซี=[2334]([1012][10])[6587][10]=[11].{\displaystyle A\times (B{\vec {r}})-C{\vec {r}}={\begin{bmatrix}2&3\\3&4\end{bmatrix}}\left({\begin{bmatrix}1&0\\1&2\end{bmatrix}}{\begin{bmatrix}1\\0\end{bmatrix}}\right)-{\begin{bmatrix}6&5\\8&7\end{bmatrix}}{\begin{bmatrix}1\\0\end{bmatrix}}={\begin{bmatrix}-1\\-1\end{bmatrix}}.}

ผลลัพธ์ที่ได้ไม่ใช่ศูนย์ ซึ่งพิสูจน์ได้ว่า AB C อย่างแท้จริง

มีเวกเตอร์ 0/1 สององค์ประกอบอยู่สี่เวกเตอร์ และครึ่งหนึ่งของเวกเตอร์เหล่านั้นจะให้เวกเตอร์ศูนย์ในกรณีนี้ (=[00]{\displaystyle {\vec {r}}={\begin{bmatrix}0\\0\end{bmatrix}}}และ=[11]{\displaystyle {\vec {r}}={\begin{bmatrix}1\\1\end{bmatrix}}}ดังนั้น โอกาสที่จะสุ่มเลือกสิ่งเหล่านี้ในการทดลองสองครั้ง (และสรุปผิดว่า AB=C) คือ 1/2 หรือ 1/4 ในกรณีทั่วไป สัดส่วนของrที่ให้เวกเตอร์ศูนย์อาจน้อยกว่า 1/2 และจะใช้จำนวนการทดลองที่มากขึ้น (เช่น 20 ครั้ง) ซึ่งทำให้ความน่าจะเป็นของข้อผิดพลาดน้อยลงมาก

การวิเคราะห์ข้อผิดพลาด

ให้pเท่ากับความน่าจะเป็นของความผิดพลาด เราอ้างว่า ถ้าA × B = Cแล้วp = 0 และถ้าA × BCแล้วp ≤ 1/2    

กรณีA × B = C  

พี=เอ×(บี)ซี=(เอ×บี)ซี=(เอ×บีซี)=0{\displaystyle {\begin{aligned}{\vec {P}}&=A\times (B{\vec {r}})-C{\vec {r}}\\&=(A\times B){\vec {r}}-C{\vec {r}}\\&=(A\times BC){\vec {r}}\\&={\vec {0}}\end{aligned}}}

โดยไม่คำนึงถึงค่าของ{\displaystyle {\vec {r}}}เนื่องจากมันใช้เพียงสิ่งนั้นเอ×บีซี=0{\displaystyle A\times BC=0}ดังนั้น ความน่าจะเป็นของข้อผิดพลาดในกรณีนี้คือ:

ปร.[พี0]=0{\displaystyle \Pr[{\vec {P}}\neq 0]=0}

กรณีA × BC  

อนุญาตดี{\displaystyle D}โดยที่

พี=ดี×=(พี1,พี2,,พีn)ที{\displaystyle {\vec {P}}=D\times {\vec {r}}=(p_{1},p_{2},\dots ,p_{n})^{T}}

ที่ไหน

ดี=เอ×บีซี=(ฉันเจ){\displaystyle D=A\times BC=(d_{ij})}.

เนื่องจากเอ×บีซี{\displaystyle A\times B\neq C}เรามีองค์ประกอบบางอย่างของดี{\displaystyle D}มีค่าไม่เป็นศูนย์ สมมติว่าองค์ประกอบนั้นฉันเจ0{\displaystyle d_{ij}\neq 0}ตามนิยามของการคูณเมทริกซ์เราจะได้ว่า:

พีฉัน=เค=1nฉันเคเค=ฉัน11++ฉันเจเจ++ฉันnn=ฉันเจเจ+y{\displaystyle p_{i}=\sum _{k=1}^{n}d_{ik}r_{k}=d_{i1}r_{1}+\cdots +d_{ij}r_{j}+\cdots +d_{in}r_{n}=d_{ij}r_{j}+y}.

สำหรับค่าคงที่บางค่าy{\displaystyle y}โดยใช้ทฤษฎีบทของเบย์สเราสามารถแบ่งกลุ่มตามy{\displaystyle y}:

เราใช้สิ่งนั้น:

ปร.[พีฉัน=0|y=0]=ปร.[เจ=0]=12{\displaystyle \Pr[p_{i}=0|y=0]=\Pr[r_{j}=0]={\frac {1}{2}}}
ปร.[พีฉัน=0|y0]=ปร.[เจ=1ฉันเจ=y]ปร.[เจ=1]=12{\displaystyle \Pr[p_{i}=0|y\neq 0]=\Pr[r_{j}=1\land d_{ij}=-y]\leq \Pr[r_{j}=1]={\frac {1}{2}}}

เมื่อแทนค่าเหล่านี้ลงในสมการ ( 1 ) เราจะได้:

ปร.[พีฉัน=0]12ปร.[y=0]+12ปร.[y0]=12ปร.[y=0]+12(1ปร.[y=0])=12{\displaystyle {\begin{aligned}\Pr[p_{i}=0]&\leq {\frac {1}{2}}\cdot \Pr[y=0]+{\frac {1}{2}}\cdot \Pr[y\neq 0]\\&={\frac {1}{2}}\cdot \Pr[y=0]+{\frac {1}{2}}\cdot (1-\Pr[y=0])\\&={\frac {1}{2}}\end{aligned}}}

ดังนั้น,

ปร.[พี=0]=ปร.[พี1=0พีฉัน=0พีn=0]ปร.[พีฉัน=0]12.{\displaystyle \Pr[{\vec {P}}=0]=\Pr[p_{1}=0\land \dots \land p_{i}=0\land \dots \land p_{n}=0]\leq \Pr[p_{i}=0]\leq {\frac {1}{2}}.}

การพิสูจน์เสร็จสมบูรณ์แล้ว

ผลที่ตามมา

การวิเคราะห์เชิงอัลกอริทึมอย่างง่ายแสดงให้เห็นว่าเวลาในการทำงานของอัลกอริทึม นี้ คือโอ(n2){\displaystyle O(n^{2})}(ในสัญกรณ์ Big O ) วิธีนี้เร็วกว่าเวลาการทำงานของอัลกอริธึมเชิงกำหนด แบบคลาสสิกซึ่งอยู่ที่โอ(n3){\displaystyle O(n^{3})}(หรือโอ(n2.372){\displaystyle O(n^{2.372})}หากใช้การคูณเมทริกซ์แบบเร็ว ) การวิเคราะห์ข้อผิดพลาดยังแสดงให้เห็นว่า หากเรียกใช้อัลกอริทึมเค{\displaystyle k}ครั้ง โดยมีขอบเขตความคลาดเคลื่อนน้อยกว่า1/2เค{\displaystyle 1/2^{k}}สามารถทำได้ ซึ่งเป็นปริมาณที่เล็กมากในเชิงเลขชี้กำลัง อัลกอริทึมนี้ยังทำงานได้รวดเร็วในทางปฏิบัติ เนื่องจากมีการใช้งานที่รวดเร็วสำหรับการคูณเมทริกซ์กับเวกเตอร์อย่างแพร่หลาย ดังนั้น การใช้อัลกอริทึมแบบสุ่ม จึง สามารถเร่งความเร็วอัลกอริทึมแบบกำหนดที่ ช้ามาก ได้

อัลกอริทึมของ Freivalds มักถูกกล่าวถึงในบทนำเกี่ยวกับอัลกอริทึมเชิงความน่าจะเป็นเนื่องจากความเรียบง่ายและวิธีการที่แสดงให้เห็นถึงความเหนือกว่าของอัลกอริทึมเชิงความน่าจะเป็นในทางปฏิบัติสำหรับปัญหาบางอย่าง

ดูเพิ่มเติม

ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Freivalds%27_algorithm&oldid=1323607201 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ อัลกอริทึมของ Freivalds

อัลกอริทึมของ Freivalds (ตั้งชื่อตามRūsiņš Mārtiņš Freivalds ) เป็นอัลกอริทึมแบบสุ่มเชิง ความน่าจะเป็น ที่ใช้ในการตรวจสอบการคูณเมทริกซ์ โดยกำหนดเมทริกซ์ขนาดn × nสามเมทริกซ์...

ป้อนข้อมูล

เมทริกซ์ n × n สาม เมทริกซ์ เอ {\displaystyle A} , บี {\displaystyle B} , และ ซี {\displaystyle C} .

เอาต์พุต

ใช่ ถ้า เอ × บี = ซี {\displaystyle A\times B=C} ไม่ อย่างอื่นก็ไม่เกี่ยว

ขั้นตอน

สร้าง เวกเตอร์ สุ่ม 0/1 ขนาด n × 1 ร → {\displaystyle {\vec {r}}} . คำนวณ พี → = เอ × ( บี ร → ) − ซี ร → {\displaystyle {\vec {P}}=A\times (B{\vec {r}})-C{\vec {r}}} .