คำถามติดแท็ก ds.data-structures

คุณสมบัติและการใช้งานของโครงสร้างข้อมูลเช่นขอบเขตพื้นที่ต่ำหรือความซับซ้อนของเวลาในการแทรกและลบวัตถุ

3
ขอบเขตล่างสำหรับโครงสร้างข้อมูล
ผลลัพธ์เป็นที่รู้จักกันหรือไม่ว่ามีกฎใดที่มีโครงสร้างข้อมูล "ดีเกินไปเกินจริง"? ตัวอย่างเช่นหนึ่งสามารถเพิ่มและเจo ฉันnฟังก์ชันการทำงานที่มีคำสั่งโครงสร้างข้อมูลการบำรุงรักษา (ดูดิเอทซ์และ Sleator STOC 87 ) และยังคงได้รับO ( 1 )การดำเนินงานเวลาหรือไม่SplitSplitSplitJoinJoinJoinO(1)O(1)\mathcal{O}(1) หรือ: หนึ่งสามารถใช้ชุดสั่งซื้อด้วยคีย์จำนวนเต็มและการดำเนินงานเวลา ? แน่นอนว่านี่เป็นเรื่องยากพอ ๆ กับการค้นพบอัลกอริธึมเชิงเส้นเวลาสำหรับการเรียงลำดับจำนวนเต็มO(1)O(1)\mathcal{O}(1) คำตอบได้รับการพิสูจน์แล้วว่าไม่มีสำหรับคำถามเหล่านี้หรือไม่ ผลลัพธ์ขอบเขตล่างรู้จักโครงสร้างข้อมูลทางธรรมชาติหรือไม่?

2
เทียบเท่ากับการทำงานอย่างหมดจดของ B-Tree
ฉันกำลังสำรวจความคิดในการเขียน DBMS ในลักษณะที่ใช้งานได้อย่างหมดจด โครงสร้างข้อมูลแบบดั้งเดิมที่ใช้สำหรับการทำดัชนีคือ B-Tree ฉันต้องการทราบถึงการทำงานที่เทียบเท่า B-Tree อย่างแท้จริงซึ่งจะได้รับการปรับปรุงเพื่อลดการเข้าถึงดิสก์ ขอบคุณ

3
การผสมแฮชที่เกี่ยวข้อง
พิจารณารายการที่มีการเชื่อมโยงต่ำมากในการตั้งค่าการทำงานอย่างหมดจด การสรรเสริญของมันได้รับการร้องจากยอดเขาและจะยังคงสูง ที่นี่ฉันจะพูดถึงหนึ่งในจุดแข็งและคำถามว่ามันจะขยายไปสู่ระดับที่กว้างขึ้นของลำดับการทำงานที่บริสุทธิ์โดยใช้ต้นไม้ ปัญหามีดังต่อไปนี้: คุณต้องการทดสอบความเท่าเทียมกันของโครงสร้างเกือบทั้งหมดในเวลา O (1) โดยใช้วิธีการแปลงแป้นพิมพ์ที่เข้มงวด หากฟังก์ชันแฮชคือการเรียกซ้ำแบบโครงสร้างเช่น hash (x: xs) = ผสม x (hash xs) ดังนั้นคุณสามารถแคชค่าแฮชของรายการอย่างโปร่งใสและอัปเดตในเวลา O (1) เมื่อองค์ประกอบถูกพิจารณาลงในรายการที่มีอยู่ . อัลกอริทึมส่วนใหญ่สำหรับรายการที่แปลงแป้นพิมพ์มีการวนซ้ำแบบโครงสร้างดังนั้นวิธีนี้จึงใช้งานได้อย่างเด่นชัด แต่สมมติว่าแทนที่จะเป็นรายการที่เชื่อมโยงโดยลำพังคุณมีลำดับต้นไม้ที่สนับสนุนการเชื่อมโยงความยาว O (n) สองลำดับในเวลา O (log n) สำหรับการแคชแฮชให้ทำงานที่นี่ฟังก์ชันการผสมแฮชจะต้องเชื่อมโยงเพื่อเคารพองศาอิสระของต้นไม้ที่แสดงถึงลำดับเชิงเส้นเดียวกัน มิกเซอร์ควรใช้ค่าแฮชของทรีย่อยและคำนวณค่าแฮชของทรีทั้งหมด นี่คือที่ฉันเมื่อหกเดือนที่แล้วเมื่อฉันใช้เวลาหนึ่งวันครุ่นคิดและค้นคว้าปัญหานี้ ดูเหมือนว่าจะไม่ได้รับความสนใจในวรรณกรรมเกี่ยวกับโครงสร้างข้อมูล ฉันเจออัลกอริธึมการแปลงรหัส Tillich-Zemor จากการเข้ารหัส มันอาศัยการคูณเมทริกซ์ 2x2 (ซึ่งเชื่อมโยง) โดยที่บิต 0 และ 1 สอดคล้องกับเครื่องกำเนิดไฟฟ้าสอง subalgebra ที่มีรายการในฟิลด์ Galois คำถามของฉันคือฉันพลาดอะไรไป จะต้องมีเอกสารที่เกี่ยวข้องทั้งในวรรณคดีเกี่ยวกับการเข้ารหัสและโครงสร้างข้อมูลที่ฉันไม่พบในการค้นหาของฉัน …

4
ต้นย่อยของต้นไม้สีแดงและสีดำ
ในขณะที่พยายามแก้ไขข้อบกพร่องในห้องสมุดฉันค้นหาเอกสารเกี่ยวกับการค้นหา subranges บนต้นไม้สีแดงและสีดำโดยไม่ประสบความสำเร็จ ฉันกำลังพิจารณาวิธีแก้ปัญหาด้วยการใช้ zippers และสิ่งที่คล้ายกับการ ดำเนินการผนวกปกติที่ใช้กับอัลกอริทึมการลบสำหรับโครงสร้างข้อมูลที่ไม่เปลี่ยนรูปแบบ แต่ฉันยังคงสงสัยว่ามีวิธีที่ดีกว่าที่ฉันไม่สามารถค้นหาได้ เกี่ยวกับการดำเนินการดังกล่าวหรือไม่ เพื่อให้ชัดเจนฉันกำลังพูดถึงอัลกอริทึมที่ให้ต้นไม้สีแดงและดำและสองขอบเขตจะผลิตต้นไม้สีแดงและสีดำใหม่พร้อมองค์ประกอบทั้งหมดของต้นไม้แรกที่อยู่ภายในขอบเขตเหล่านั้น แน่นอนว่าขอบเขตบนของความซับซ้อนนั้นคือความซับซ้อนของการสำรวจต้นไม้ต้นหนึ่งและสร้างอีกต้นโดยการเพิ่มองค์ประกอบ

2
รายการความแตกต่างในการตั้งโปรแกรมการทำงาน
คำถามมีอะไรใหม่ในโครงสร้างข้อมูลที่ใช้งานได้จริงตั้งแต่ Okasaki? (และเมื่อเทียบกับการเขียนโปรแกรมเชิงตรรกะ) ซึ่งเป็นสิ่งที่ฉันสนใจเมื่อเร็ว ๆ นี้สิ่งนี้ทำให้ฉันค้นหาการใช้งานรายการความแตกต่างสำหรับ Haskell ฉันมีสองคำถาม (ยกโทษ / แก้ไขให้ฉันถ้าฉันควรทำให้พวกเขาสองคำถามที่แตกต่างกันใน StackExchange) คำถามง่ายๆคือทุกคนตระหนักถึงการพิจารณาทางวิชาการของรายการที่แตกต่างในการเขียนโปรแกรมการทำงานและ / หรือการใช้งานนอกเหนือจากหนึ่งในห้องสมุด Haskell? คำตอบของ jbapple ไม่ได้อ้างถึงรายการที่แตกต่าง (รายการความแตกต่างในการเขียนโปรแกรมเชิงตรรกะมีอยู่ในตำนานและในแหล่งข้อมูลสองแห่งที่ฉันมีอยู่แถว ๆ นี้ (TM) ก่อนที่จะค้นพบการใช้งาน Haskell ฉันไม่ทราบว่าแนวคิดนั้นเพิ่มขึ้นจากตรรกะไปจนถึงการเขียนโปรแกรมเชิงหน้าที่ จริงอยู่ที่รายการความแตกต่างของ Haskell นั้นเป็นฟังก์ชั่นการใช้งานตามลำดับขั้นสูงและทำงานแตกต่างจากฟังก์ชั่นการเขียนโปรแกรมแบบลอจิก แต่อินเทอร์เฟซคล้ายกันอย่างแน่นอน สิ่งที่น่าสนใจ (และไกลออกไป) ที่น่าสนใจยิ่งกว่าที่ฉันต้องการถามคือว่าขอบเขตบนแบบ asymptotic ที่อ้างสิทธิ์สำหรับไลบรารีรายการผลต่าง Haskell ดังกล่าวนั้นถูกต้องหรือน่าเชื่อถือ ความสับสนของฉันอาจจะเป็นเพราะฉันหายไปบางสิ่งบางอย่างเกี่ยวกับการที่ชัดเจนเกี่ยวกับเหตุผลที่ซับซ้อนด้วยความเกียจคร้าน แต่ขอบเขตอ้างว่าเพียง แต่จะทำให้รู้สึกถึงฉันถ้าเปลี่ยนตัวมากกว่าโครงสร้างข้อมูลขนาดใหญ่ (หรือการปิดหรือค้นหาตัวแปรหรือบางสิ่งบางอย่าง ) มักจะต้องใช้เวลาอย่างต่อเนื่อง หรือ "จับ" เพียงแค่ว่าไม่มีเวลา จำกัด สำหรับ "หัว" และ …

1
จำเป็นต้องมีความอิสระในการผูกมัดแยกกันมากแค่ไหน?
หากมีการใส่ลูกบอลลูกลงในถังขยะnอย่างสม่ำเสมอถังที่บรรจุน้ำหนักมากที่สุดจะมีลูกบอลO ( lg n / lg lg n ) ที่มีความน่าจะเป็นสูง ใน"พลังแห่งการทำตารางง่าย ๆ " , Pătraşcuและ Thorup พูดถึงว่า"Chernoff-Hoeffding ขอบเขตสำหรับการใช้งานที่มีความเป็นอิสระ จำกัด " ( กระจก ) แสดงให้เห็นว่าสิ่งนี้ถูกผูกไว้กับประชากรของถังขยะที่โหลดหนักที่สุดเช่นกันΩ ( lg n / lg lg n ) -ฟังก์ชันแฮชอิสระnnnnnnO ( lgn / lgLGn )O(lg⁡n/lg⁡lg⁡n)O(\lg n/\lg \lg n)Ω ( lgn / lgLGn )Ω(lg⁡n/lg⁡lg⁡n)\Omega(\lg n/\lg \lg n) ใน"ลูกบอลและถังขยะ: …

2
โครงสร้างข้อมูลสำหรับการอัพเดตตามช่วงเวลาและการสอบถามจำนวนศูนย์
ฉันกำลังมองหาโครงสร้างข้อมูลที่จะรักษาตารางจำนวนเต็มขนาดและช่วยให้ดำเนินการต่อไปในเวลาn)n O ( บันทึกn )เสื้อttnnnO ( บันทึกn )O(log⁡n)O(\log n) เพิ่มขึ้น( a , b )increase(a,b)\text{increase}(a,b)ซึ่งจะเป็นการเพิ่ม[b]t [ a ] , t [ a + 1 ] , … , t [ b ]t[a],t[a+1],…,t[b]t[a],t[a+1],\ldots,t[b] ลดลง( a , b )decrease(a,b)\text{decrease}(a,b)ซึ่งจะเป็นการลด[b]t [ a ] , t [ a + 1 ] , … , t …

4
การอ้างอิงทฤษฎีบทพื้นฐานเกี่ยวกับการหมุนของต้นไม้
ต้นไม้การค้นหาแบบไบนารีสองต้นถูกกล่าวว่าเป็นเชิงเส้นตรงเมื่อพวกเขาเห็นด้วยในการสำรวจเส้นทาง ทฤษฎีบทต่อไปนี้อธิบายว่าทำไมการหมุนต้นไม้จึงเป็นพื้นฐาน: ให้ A และ B เป็นต้นไม้ค้นหาแบบไบนารี จากนั้น A และ B เทียบเท่าเชิงเส้นหากว่าพวกมันเชื่อมต่อกันด้วยลำดับการหมุนของต้นไม้ ฉันสังเกตเห็นผลลัพธ์นี้เมื่อฉันเรียนรู้เกี่ยวกับโครงสร้างข้อมูลเป็นครั้งแรกนานมาแล้วและต้องการที่จะเข้าใจสถานะพิเศษของการหมุนของต้นไม้อย่างลึกซึ้งยิ่งขึ้น การพิสูจน์นั้นง่ายและใช้งานง่าย: หมุนองค์ประกอบที่น้อยที่สุดจนถึงตำแหน่งรากตามแนวกระดูกสันหลังด้านซ้าย ต้นไม้ที่ถูกจัดเรียงใหม่จะไม่มีต้นไม้ย่อยที่เหลืออยู่ตามลำดับ ทีนี้มาเติมที่ทรีย่อยที่เหมาะสม ผลที่ได้คือรูปแบบปกติสำหรับการทดสอบความเท่าเทียมกันเชิงเส้น ในขณะที่มันเป็นทฤษฎีพื้นฐานฉันไม่เคยเจอในวรรณกรรมเลย ฉันจะขอบคุณการอ้างอิงอย่างมากในครั้งต่อไปที่ฉันต้องใช้ผลลัพธ์นี้ (เครื่องมือช่วยพัฒนาสมองโบนัส: อัลกอริธึมที่ดีที่สุดสำหรับการค้นหาลำดับการหมุนของต้นไม้ที่สั้นที่สุดที่เชื่อมโยงต้นไม้การค้นหาไบนารีที่เทียบเท่ากันสองแบบเชิงเส้นคืออะไร)

2
โครงสร้างข้อมูลสำหรับการจัดสรรหน่วยความจำแบบไดนามิก
นึกถึงโมเดลเครื่องมือตรวจเซลล์ มีโครงสร้างข้อมูลที่สามารถจัดสรรชิ้นที่ต่อเนื่องกันของหน่วยความจำของความยาวใด ๆ (เหมือนเช่น malloc ใน C) และฟรีพวกเขาขณะที่หลีกเลี่ยงการแบ่งส่วนหน่วยความจำและดำเนินการการดำเนินงานในทุกกรณีที่แย่ที่สุด O กำหนด (log n) เวลาที่ n คือ ขนาดทั้งหมดของหน่วยความจำคืออะไร? โดยการหลีกเลี่ยงการแบ่งเซ็กเมนต์หน่วยความจำฉันหมายความว่าหากจำนวนเซลล์ว่างทั้งหมดคือ F ดังนั้นฉันควรจะสามารถจัดสรรเซ็กเมนต์ที่ต่อเนื่องกันของเซลล์ F หรือเซลล์ F

1
จำนวนคิวลำดับความสำคัญพร้อมกับ deleteMin ที่มีความอ่อนไหวด้านการแจกจ่าย
มีในคิวลำดับความสำคัญจำนวนเต็มที่ใช้คำของพื้นที่ที่มีการดำเนินการดังต่อไปนี้ทั้งหมดในเวลาที่เลวร้ายที่สุดกรณีและไม่มีการเข้าถึงแบบสุ่ม:O(n)O(n)O(n) createEmptyQueueไว้ในสำหรับบางคนคงคO(lgcU)O(lgcU)O(lg^c U)ccc insertใน(1)O(1)O(1)O(1) deleteMinในโดยที่\ delta _ {\ min}คือความแตกต่างระหว่างคีย์ที่เล็กที่สุดและคีย์ที่สองที่เล็กที่สุดO(δmin)O(δmin)O(\delta_{\min})δminδmin\delta_{\min} นอกจากนี้เมื่อคีย์kkkได้รับเรื่องไปยังdeleteMinทุกแทรกเพิ่มเติมเป็น>k>k> kk งานที่เกี่ยวข้อง: โบ et al. เรื่อง "การค้นหาในท้องถิ่นอย่างรวดเร็วและมีการปรับปรุงในขอบเขตจักรวาล"ซึ่งจะเร็วกว่าที่ฉันต้องการสำหรับแต่ช้ากว่าที่ฉันต้องการสำหรับdeleteMininsert Brodnik et al. ของ "คิวลำดับความสำคัญของเวลาคงที่กรณีที่แย่ที่สุด"ซึ่งใช้ "Yggdrasil memory" ที่แปลกใหม่ สำหรับวัตถุประสงค์ของคำถามนี้ฉันสนใจรุ่น RAM จำนวนเต็มมาตรฐานเพิ่มเติม Brodnik และ Karlsson ของ "Multiprocess Time Queue"ซึ่ง จำกัด การแทรกองค์ประกอบด้วยคีย์ใน(kmin,kmin+δmin](kmin,kmin+δmin](k_{\min}, k_{\min} + \delta_{\min}]โดยที่kminkmink_{\min}เป็นค่าของขั้นต่ำ สำคัญ. โปรดทราบว่านี่ค่อนข้างง่ายด้วยตารางแฮช แต่ใช้การตัดจำหน่ายและการสุ่ม: คิวคือคู่ของตารางแฮชของคีย์และสำเนาของคีย์ต่ำสุด insert เพิ่มคีย์ลงในตารางแฮชและอัพเดตสำเนาคีย์ขั้นต่ำตามความเหมาะสม deleteMinค้นหาคีย์ขั้นต่ำในตารางแฮชจากนั้นค้นหาคีย์ต่ำสุดถัดไปโดยค้นหาตามลำดับkmin+1,kmin+2,kmin+3,…kmin+1,kmin+2,kmin+3,…k_{\min} + 1, k_{\min} …

1
องค์ประกอบที่น้อยที่สุดของเพรดิเคตแบบโมโนโทนิกเหนือ powerset
พิจารณาเนื่องกริยามากกว่า powerset 2 | n | (สั่งโดยการรวม) โดย "monotonic" ฉันหมายถึง: ∀ x , y ∈ 2 | n | เช่นว่าx ⊂ Yถ้าP ( x )แล้วP ( Y ) ฉันกำลังมองหาอัลกอริทึมเพื่อค้นหาองค์ประกอบขั้นต่ำทั้งหมดของPนั่นคือx ∈ 2 | n | แบบนั้นP ( x )PPP2|n|2|n|2^{|n|}∀x,y∈2|n|∀x,y∈2|n|\forall x, y \in 2^{|n|}x⊂yx⊂yx \subset yP(x)P(x)P(x)P(y)P(y)P(y)PPPx∈2|n|x∈2|n|x \in 2^{|n|}P(x)P(x)P(x)แต่ , ¬ P ( …

6
การคำนวณประชากรโดยประมาณของฟิลเตอร์บลูม
ให้ฟิลเตอร์บลูมของขนาด N-bits และฟังก์ชันแฮช K ซึ่ง M-bits (โดยที่ M <= N) ของฟิลเตอร์ถูกตั้งค่า เป็นไปได้หรือไม่ที่จะประมาณจำนวนองค์ประกอบที่แทรกลงในตัวกรองบลูม ตัวอย่างง่ายๆ ฉันคร่ำครวญตัวอย่างต่อไปนี้สมมติว่า BF ของ 100 บิตและ 5 ฟังก์ชันแฮชที่ตั้งค่า 10 บิต ... สถานการณ์กรณีที่ดีที่สุด: สมมติว่าฟังก์ชั่นแฮชสมบูรณ์แบบและแมปบิตที่ไม่ซ้ำกันสำหรับค่า X จำนวนหนึ่งจากนั้นกำหนด 10 บิตเราสามารถพูดได้ว่ามีเพียง 2 องค์ประกอบที่ใส่เข้าไปใน BF สถานการณ์กรณีที่เลวร้ายที่สุด: สมมติว่าฟังก์ชันแฮชไม่ดีและแมปไปยังบิตเดียวกันอย่างสม่ำเสมอ (แต่ไม่ซ้ำกันในแต่ละอื่น ๆ ) จากนั้นเราสามารถพูดได้ว่า 10 องค์ประกอบถูกแทรกลงใน BF ช่วงน่าจะเป็น [2,10] ซึ่งอาจอยู่ในช่วงนี้ประมาณโดยความน่าจะเป็นที่เป็นบวกปลอมของตัวกรอง - ฉันติดอยู่ที่จุดนี้

2
การย้อนกลับรายการโดยใช้สองคิว
คำถามนี้ได้รับแรงบันดาลใจจากคำถามที่มีอยู่เกี่ยวกับว่าสแต็กสามารถจำลองได้โดยใช้สองคิวในเวลาตัดจำหน่ายต่อการดำเนินการสแต็ก คำตอบดูเหมือนจะไม่เป็นที่รู้จัก นี่คือคำถามที่เฉพาะเจาะจงมากขึ้นซึ่งตรงกับกรณีพิเศษที่การดำเนินการ PUSH ทั้งหมดจะดำเนินการก่อนตามด้วยการดำเนินการ POP ทั้งหมด รายการขององค์ประกอบNสามารถย้อนกลับได้อย่างมีประสิทธิภาพโดยใช้สองคิวที่ว่างเปล่าเริ่มแรกได้อย่างไร การดำเนินการทางกฎหมายคือ:O(1)O(1)O(1)NNN จัดวางองค์ประกอบถัดไปจากรายการอินพุต (ไปยังส่วนท้ายของคิวทั้งสอง) ถอนออกจากองค์ประกอบที่หัวของคิวทั้งสองและจัดคิวอีกครั้ง (ไปที่ส่วนท้ายของคิวทั้งสอง) ถอนออกจากองค์ประกอบที่ส่วนหัวของคิวอย่างใดอย่างหนึ่งและเพิ่มลงในรายการผลลัพธ์ ถ้ารายการป้อนข้อมูลประกอบด้วยองค์ประกอบวิธีการที่ไม่จำนวนขั้นต่ำของการดำเนินงานที่จำเป็นในการสร้างรายชื่อส่งออกตรงกันข้าม[ N , N - 1 , . . , 2 , 1 ]ประพฤติตน? หลักฐานที่แสดงว่ามันโตเร็วกว่าO ( N )จะน่าสนใจเป็นพิเศษเพราะมันจะช่วยแก้ปัญหาเดิมในแง่ลบได้[1,2,...,N−1,N][1,2,...,N−1,N][1,2,...,N-1,N][N,N−1,...,2,1][N,N−1,...,2,1][N,N-1,...,2,1]O(N)O(N)O(N) Update (15 มกราคม 2011): ปัญหาสามารถแก้ไขได้ในดังที่แสดงในคำตอบที่ส่งและความคิดเห็นของพวกเขา; และขอบเขตล่างของΩ ( N )เป็นเรื่องเล็กน้อย ขอบเขตเหล่านี้สามารถปรับปรุงได้หรือไม่?O(NlogN)O(Nlog⁡N)O(N \log N)Ω(N)Ω(N)\Omega(N)

2
ต้นไม้ที่สมดุลง่าย ๆ กับ O (1) concat
ในกรณีที่เลวร้ายที่สุดในการทำงานอย่างหมดจดเวลาคงรายการที่เรียงลำดับ Catenable, Brodal และคณะ นำเสนอต้นไม้ที่สมดุลการทำงานอย่างหมดจดด้วย O (1) concatenate และ O (lg n) แทรกลบและค้นหา โครงสร้างข้อมูลค่อนข้างซับซ้อน มีแผนภูมิการค้นหาที่สมดุลง่ายกว่าโดยมี O (1) เรียงต่อกันทำงานหรือไม่

2
สนุกกับ Invermann ผกผัน
ฟังก์ชัน Ackermann ผกผันเกิดขึ้นบ่อยครั้งเมื่อวิเคราะห์อัลกอริทึม การนำเสนอที่ดีของมันอยู่ที่นี่: http://www.gabrielnivasch.org/fun/inverse-ackermann α1(n)=[n/2]α1(n)=[n/2]\alpha_1(n) = [n/2] α2(n)=[log2n]α2(n)=[log2⁡n]\alpha_2(n) = [\log_2 n] α3(n)=log∗nα3(n)=log∗⁡n\alpha_3(n) = \log^* n . . ......... αk(n)=1+αk(αk−1(n))αk(n)=1+αk(αk−1(n))\alpha_k(n) = 1 + \alpha_k(\alpha_{k−1}(n))α(n)=min{k:αk(n)≤3}α(n)=min{k:αk(n)≤3}\alpha(n) = \min\{k: \alpha_k(n)\leq 3\} คำถามของฉันคือฟังก์ชั่นคืออะไร เห็นได้ชัด(n) สิ่งที่ขอบเขตที่เข้มงวดมากขึ้นหนึ่งสามารถให้กับk (n) ? เป็นk (n) \ leq \ Log \ alpha (n) ?1 « k ( n ) ≤ α …

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