คำถามติดแท็ก algorithms

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

3
เป็นไปได้หรือไม่ที่จะใช้ตารางแฮชแบบกระจายโดยไม่ต้องใช้ตัวดำเนินการ%
ฉันต้องการใช้ตารางแฮชที่กระจายอย่างรวดเร็วใน C # ฉันมีปัญหาในการเลือกฟังก์ชั่นแฮช จำกัด ของฉันที่ใช้รหัสแฮชตามอำเภอใจและ "จำกัด " มันเพื่อให้สามารถใช้สร้างดัชนีถังได้ มีสองตัวเลือกที่ฉันเห็น: ในมือข้างหนึ่งคุณสามารถตรวจสอบให้แน่ใจว่าถังของคุณมีองค์ประกอบจำนวนมากเสมอและเพื่อ จำกัด การแฮชคุณเพียงแค่ปรับค่าตามจำนวนถัง นี่คือความจริงแล้วพจนานุกรมของ. NET ทำอะไร ปัญหาของวิธีนี้คือการใช้% ช้ามากเมื่อเทียบกับการปฏิบัติการอื่น ถ้าคุณมองไปที่ตารางการเรียนการสอน Agner ตัดหมอก , idiv(ซึ่งเป็นรหัสการชุมนุมที่ได้รับการสร้างขึ้นสำหรับ%) มีการเรียนการสอนแฝง ~ 25 รอบสำหรับโปรเซสเซอร์ Intel ใหม่ เปรียบเทียบนี้เพื่อรอบ 3 mulหรือ 1 สำหรับ Ops บิตเช่นand, หรือorxor ในทางกลับกันคุณสามารถมีจำนวนของถังเสมอได้ 2 คุณยังจะต้องคำนวณโมดูลัสของแฮชดังนั้นคุณจึงไม่ได้พยายามทำดัชนีนอกอาร์เรย์ แต่คราวนี้มันจะมีราคาไม่แพง . เนื่องจากกำลังของ 2 % Nเป็นเพียง& (N - 1)ข้อ จำกัด …

1
อัลกอริทึมในการสร้างขอบและจุดยอดออกไปด้านนอกจากจุดเริ่มต้นที่มีหลายหลากสูงสุดเท่ากับ 3
ฉันกำลังสร้างเกม 2d สำหรับเว็บไซต์ที่มีขนาดใหญ่มาก (โดยทั่วไปมีขนาดใหญ่มาก) เริ่มแรกจักรวาลประกอบด้วยดาว 6 ดวงที่อยู่ห่างจากจุดกำเนิดเท่ากัน (0, 0) งานของฉันคือการสร้างดาวให้มากขึ้นซึ่งจะมี "เส้นทาง" (ขอบ) ที่เชื่อมต่อซึ่งกันและกัน ฉันจะออกแบบอัลกอริทึมที่ตรงตามข้อ จำกัด เหล่านี้ได้อย่างไร: ดวงดาวถูกสร้างแบบสุ่มออกไปด้านนอก (เช่น (x, y) พิกัดสำหรับดาวดวงใหม่จะค่อยๆออกไปด้านนอกจาก (0, 0) ในทุกทิศทางโดยเฉพาะในรูปแบบเกลียว ขอบจะไม่ข้าม แม้ว่าจะมีความแตกต่างบ้าง แต่ดาวดวงใหม่ไม่ควรอยู่ไกลหรืออยู่ใกล้ดาวดวงอื่นมากเกินไป (เช่นต้องมีรัศมีต่ำสุด) ไม่มีดาว / จุดควรมีหลายหลากมากกว่า 3 ระบุว่าทั้งหมดนี้จะถูกเก็บไว้ในฐานข้อมูลอัลกอริทึมไม่สามารถมีราคาแพงเกินไป กล่าวอีกนัยหนึ่งฉันชอบที่จะได้รับสิ่งที่ซับซ้อน O (n) (ฉันไม่รู้ว่าสิ่งนี้เป็นไปได้หรือไม่) โดยพื้นฐานแล้วสิ่งที่ฉันกำลังมองหาคือกาแลคซีที่มีลักษณะเป็นดาวหางโดยที่ดวงดาวเป็นจุดบนกราฟและการเดินทางระหว่างดวงดาวจะถูกแสดงด้วยขอบระหว่างดาวเหล่านั้น ขั้นตอนเฉพาะที่ฉันต้องแก้ไขคือ: สร้างจุดในบริเวณใกล้เคียงกับดวงดาวอื่นที่ยังไม่ได้เป็น 3 เท่า ค้นหาดาวดวงแรกที่ยังไม่มีพหุคูณเท่ากับ 3 ซึ่งจะไม่สร้างความขัดแย้งให้กับขอบ หากดาวอยู่ห่างจากหน่วย x อย่างน้อยที่สุดให้สร้างขอบระหว่างจุดสองจุด ฉันพยายามหาวิธีแก้ปัญหา แต่ทักษะคณิตศาสตร์ของฉัน …

5
วิธีที่ง่ายและสะอาดในการเปรียบเทียบตัวเลขสามตัว
ฉันได้รับรหัสบางอย่างที่มีลำดับของการifทำงานที่ แต่ก็รู้สึกยุ่ง โดยพื้นฐานแล้วฉันต้องการเลือกจำนวนเต็มสามตัวที่ใหญ่ที่สุดและตั้งค่าสถานะเป็นคำพูดที่เลือก รหัสปัจจุบันของฉันดูเหมือนว่านี้: a = countAs(); b = countBs(); c = countCs(); if (a > b && a > c) status = MOSTLY_A; else if (b > a && b > c) status = MOSTLY_B; else if (c > a && c > b) status = MOSTLY_C; else status …
11 algorithms  c 

2
เป็นไปได้หรือไม่ที่จะเพิ่มความเร็วตารางแฮชโดยใช้แผนผังการค้นหาแบบไบนารีสำหรับการโยงแบบแยกกัน
ฉันต้องการใช้ตารางแฮชโดยใช้ Binary Search Trees เพื่อลดความซับซ้อนในการค้นหาในกระบวนการแยกการเชื่อมโยงจาก O (n) (โดยใช้รายการที่เชื่อมโยง) ถึง O (log n) (โดยใช้ BST) สามารถทำได้และถ้าใช่แล้วได้อย่างไร มันจะง่ายกว่าที่จะเข้าใจว่าการแก้ปัญหาเป็นขั้นตอนการดำเนินการตามตรรกะ ฉันต้องการลดเวลาการค้นหาใน hashtable (บิลด์โดยใช้การโยงแบบแยก) แต่ในเวลาเดียวกันฉันไม่ต้องการเพิ่มเวลาการแทรก สำหรับโครงการของฉันฉันไม่สามารถเปลี่ยนฟังก์ชันแฮชเพื่อลดการชน แต่เนื่องจากความสามารถในการขยายขนาดการชนจึงเกิดขึ้น ฉันพยายามหางานทำเพื่อที่ฉันจะได้ทำงานกับการเข้าถึงที่ดีที่สุดและแทรกเวลาในกรณีที่เกิดการชน ... คือการจัดการสถานะปัจจุบันของสิ่งต่าง ๆ มากกว่าที่จะปรับโครงสร้างอัลกอริทึมทั้งหมด หากไม่ได้เลื่อนออกไปจะต้องปรับโครงสร้าง ดังนั้นความคิดใด ๆ

3
รายการคำที่ยาวที่สุดพร้อมตัวอักษรเริ่มต้นและตัวอักษรที่ตรงกัน
เพื่อนของฉันบอกปัญหาที่เขาบอกว่าเป็นเรื่องง่าย แต่ฉันไม่สามารถหาอัลกอริทึมที่ดีที่จะใช้ทำมันได้ คุณจะได้รับการป้อนคำ 100 คำในภาษาอังกฤษแบบสุ่ม คุณต้องค้นหาสตริงคำที่ยาวที่สุดที่ตัวอักษรตัวสุดท้ายในคำเดียวตรงกับตัวอักษรตัวแรกในคำถัดไป คุณสามารถใช้แต่ละคำได้ครั้งเดียวเท่านั้น ตัวอย่างเช่นหากคุณได้รับคำว่า "cat", "dog", "that" สตริงที่ยาวที่สุดที่คุณสามารถทำได้คือ "cat -> that" หากคุณได้รับคำว่า "mouse", "moose", "unicorn" สตริงที่ยาวที่สุดที่คุณสามารถสร้างได้จะเป็นเพียงหนึ่งคำ (เนื่องจากไม่มีลิงก์คำเหล่านั้น) หากคุณได้คำว่า "bird", "dish", "harb" สตริงที่ยาวที่สุดที่คุณสามารถทำได้คือ "harb -> bird -> dish" (หรือ "dish -> harb -> bird" หรือ "bird - > dish -> harb ") ฉันคิดว่าการสร้างแบบจำลองนี้เป็นกราฟวงกลมกำกับ แต่ละโหนดจะเป็นเพียงคำเดียวโดยจุดยอดจะไปที่แต่ละคำ / โหนดที่เริ่มต้นด้วยตัวอักษรคำนี้ลงท้ายด้วย +-------+ …
11 algorithms 

2
ระบบเสนอราคาโฆษณาของ Facebook ทำงานอย่างไร
เมื่อคุณสร้างโฆษณาบน Facebook คุณจะได้รับช่วง " ราคาเสนอที่แนะนำ " (เช่น $ 0.90 - $ 2.15 USD) ตามหน้านี้ : ช่วงการเสนอราคาที่แนะนำอยู่ที่นั่นเพื่อช่วยคุณเลือกการเสนอราคาสูงสุดเพื่อให้โฆษณาของคุณประสบความสำเร็จ ขึ้นอยู่กับจำนวนผู้โฆษณารายอื่นที่แข่งขันกันเพื่อแสดงโฆษณาของตนต่อผู้ชมเดียวกันกับคุณ ฉันสนใจที่จะเข้าใจสิ่งที่เกิดขึ้นจริง (ทางเทคนิค) ภายใต้ประทุนที่นี่ บอกผู้ใช้ว่าเข้าสู่ Facebook บนฝั่งเซิร์ฟเวอร์จะมีการร้องขอ HTTP ที่เบราว์เซอร์ของผู้ใช้ที่ส่ง (เป็นส่วนหนึ่งของการเข้าสู่ระบบ) ได้รับการจัดการและเซิร์ฟเวอร์จำเป็นต้องทราบว่าโฆษณาใดที่จะแสดงกลับไปยังผู้ใช้ ฉันคิดว่านี่เป็นสิ่งที่ระบบ "การเสนอราคา" เข้ามาเล่น สมมติว่าจากข้อมูลประชากรของผู้ใช้รายนี้และจากการกำหนดเป้าหมายผู้ชมที่ผู้โฆษณาคู่แข่งหลายรายออกแบบแคมเปญด้วยเราสมมติว่า Facebook เห็นกลุ่มโฆษณาที่แตกต่างกัน 20 รายการที่สามารถส่งคืนได้ ระบบการเสนอราคานี้ช่วยให้ Facebook ระบุได้อย่างไรว่าโฆษณา 20 รายการใดที่มันกลับไปยังฝั่งไคลเอ็นต์ ฉันคาดเดาว่าผู้โฆษณาที่ "เสนอราคามากกว่า" จะได้รับความสำคัญมากกว่าผู้ที่ "เสนอราคาน้อยลง" แต่การเสนอราคานี้จะเกิดขึ้นเมื่อใด ผู้โฆษณาต้องการเสนอราคาซ้ำบ่อยครั้งเพียงใด การเสนอราคามีผลผูกพันนานเท่าใด เมื่อฉันเข้าใจแนวคิดเกี่ยวกับการใช้งานเหล่านี้ที่อยู่เบื้องหลังโฆษณามันอาจจะเห็นได้อย่างชัดเจนว่า "กลยุทธ์การเลือก" ซึ่งแบ็กเอนด์ใช้ดังต่อไปนี้: …

5
โดยทางโปรแกรมแล้วการหาสัญกรณ์กุ๊บ (สัญกรณ์ Big O หรือ Theta) ของอัลกอริทึม?
ฉันเคยค้นหาสัญกรณ์ Landau (Big O, Theta ... ) ของอัลกอริทึมของฉันด้วยมือเพื่อให้แน่ใจว่าพวกเขาได้รับการปรับให้เหมาะสมที่สุดเท่าที่จะเป็นไปได้ แต่เมื่อฟังก์ชั่นมีขนาดใหญ่และซับซ้อนจริงๆ เวลามากเกินไปที่จะทำด้วยมือ นอกจากนี้ยังมีแนวโน้มที่จะเกิดข้อผิดพลาดของมนุษย์ ฉันใช้เวลากับ Codility (แบบฝึกหัดการเข้ารหัส / อัลโก) และสังเกตว่าพวกเขาจะให้สัญกรณ์ Landau สำหรับการแก้ปัญหาที่คุณส่ง (ทั้งในเวลาและการใช้หน่วยความจำ) ฉันสงสัยว่าพวกเขาทำได้อย่างไร ... คุณจะทำอย่างไร มีวิธีอื่นนอกเหนือจากการวิเคราะห์คำศัพท์หรือการแยกรหัส? คำถามนี้เกี่ยวกับ PHP และหรือ JavaScript เป็นหลัก แต่ฉันเปิดรับทุกภาษาและทุกทฤษฎี

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

5
แปลงรายการค่าเร่งรัด 24 ชั่วโมงเป็นทั้งหมดโดยชั่วโมง
สมมติว่าฉันมีรายการค่าการตกตะกอนเป็นชั่วโมงแต่ละคนแสดงว่าฝนตกมากแค่ไหนใน 24 ชั่วโมงก่อนเรียงตามวันที่ ตัวอย่างเช่น: { '2012-05-24 12:00': 0.5, // .5" of rain from 5/23 12:00 - 5/24 11:59 '2012-05-24 11:00': 0.6, // .6" of rain from 5/23 11:00 - 5/24 10:59 '2012-05-24 10:00': 0.6, // .6" of rain from 5/23 10:00 - 5/24 09:59 ... '2012-05-23 10:00': 0 } มีกลยุทธ์ …

6
มันไม่มีประสิทธิภาพที่จะต่อสตริงเข้าทีละตัว?
ฉันจำได้คืนจากวันที่ฉันเขียนโปรแกรมใน C ซึ่งเมื่อมีการรวมสองสายเข้าด้วยกันระบบปฏิบัติการจะต้องจัดสรรหน่วยความจำสำหรับสตริงที่เข้าร่วมจากนั้นโปรแกรมสามารถคัดลอกข้อความสตริงทั้งหมดไปยังพื้นที่ใหม่ในหน่วยความจำ ได้รับการปล่อยตัว ดังนั้นหากทำหลายครั้งเช่นเดียวกับในกรณีที่เข้าร่วมรายการระบบปฏิบัติการจะต้องจัดสรรหน่วยความจำให้มากขึ้นเรื่อย ๆ เพียงเพื่อให้ระบบเปิดตัวหลังจากการเชื่อมต่อครั้งต่อไป วิธีที่ดีกว่าในการทำเช่นนี้ใน C คือการกำหนดขนาดโดยรวมของสตริงที่รวมกันและจัดสรรหน่วยความจำที่จำเป็นสำหรับรายการสตริงที่เข้าร่วมทั้งหมด ตอนนี้ในภาษาการเขียนโปรแกรมสมัยใหม่ (เช่น C #) ฉันมักจะเห็นเนื้อหาของคอลเลกชันที่ถูกรวมเข้าด้วยกันโดยการวนซ้ำผ่านคอลเลกชันและเพิ่มสตริงทั้งหมดครั้งละหนึ่งครั้งเพื่อการอ้างอิงสตริงเดี่ยว สิ่งนี้ไม่มีประสิทธิภาพแม้แต่กับพลังการคำนวณที่ทันสมัย?

7
หากอัลกอริทึมของคุณถูกต้องมันสำคัญแค่ไหนที่คุณจะต้องเขียนมันใช้เวลานานแค่ไหน? [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว เมื่อเร็ว ๆ นี้ฉันพบว่า Facebook มีความท้าทายในการเขียนโปรแกรมซึ่งหากทำอย่างถูกต้องคุณจะได้รับการสัมภาษณ์ทางโทรศัพท์โดยอัตโนมัติ มีตัวอย่างท้าทายที่ขอให้คุณเขียนอัลกอริทึมที่สามารถแก้ปัญหาประเภทหอคอยแห่งฮานอยได้ เมื่อกำหนดจำนวนหมุดและดิสก์จำนวนหนึ่งการกำหนดค่าเริ่มต้นและขั้นสุดท้าย อัลกอริทึมของคุณต้องกำหนดขั้นตอนที่น้อยที่สุดที่เป็นไปได้เพื่อไปยังการกำหนดค่าขั้นสุดท้ายและส่งออกขั้นตอน ความท้าทายตัวอย่างนี้ให้คุณ จำกัด เวลา 45 นาที แต่ให้คุณยังคงทดสอบโค้ดของคุณเพื่อดูว่ามันผ่านไปเมื่อหมดเวลาที่กำหนดหรือไม่ ฉันไม่รู้วิธีแก้ปัญหาทางคณิตศาสตร์ที่น่ารักที่สามารถแก้ไขได้และฉันไม่ต้องการค้นหาสิ่งใดเพราะฉันคิดว่ามันจะเป็นการโกง ดังนั้นฉันจึงพยายามที่จะแก้ปัญหาที่ดีที่สุดที่ฉันสามารถทำได้ด้วยตัวเอง ฉันสามารถสร้างอัลกอริทึมที่ทำงานและผ่านไปได้ อย่างไรก็ตามฉันใช้เวลามากกว่า 4 ชั่วโมงในการทำนานกว่าข้อกำหนด 45 นาที เนื่องจากฉันใช้เวลานานกว่าเวลาที่กำหนดมากฉันจึงไม่ได้ลองการท้าทายที่แท้จริง เรื่องนี้ทำให้ฉันสงสัยว่าในความเป็นจริงมันเป็นเรื่องสำคัญจริง ๆ ไหมที่ฉันใช้เวลานานขนาดนั้น? ฉันหมายถึงนี่เป็นสัญญาณว่าฉันจะไม่สามารถหางานในสถานที่เช่นนี้ (ไม่ใช่แค่ Facebook, Google, Fog Creek, ฯลฯ ) และต้องการลดแรงบันดาลใจของฉันลงหรือทำตามความเป็นจริงที่ผ่านมา ในความพยายามครั้งแรกของฉันแม้ว่าจะใช้เวลานานเกินไปจะดีไหม?
11 algorithms 

6
วิธีการสอนสคริปต์เพื่อตรวจสอบการเสียดสี? [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจเรียกร้องให้มีการอภิปรายโต้แย้งโต้แย้งหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน8 ปีที่ผ่านมา ขณะนี้ฉันกำลังสร้างสคริปต์ที่สนุกซึ่งโดยทั่วไปตรงกับวลีที่กำหนดและให้คำตอบที่กำหนดไว้ล่วงหน้าตามคะแนนการแข่งขัน คุณสามารถขอให้มันดึงข้อมูลบางอย่างจากฟีดสดเรียกใช้งานบอกเกร็ดเล็กเกร็ดน้อยหรือเพียงแค่พูดคุยกับเธอ ฉันมีการตรวจจับในตัวสำหรับคำไม่ดีแคปล็อคหรือทั้งสองอย่าง โปรแกรมมีชื่อเด็กหญิงและฉันพยายามทำให้ใกล้เคียงกับการเป็นเด็กผู้หญิงมากที่สุดเท่าที่จะทำได้ในแง่ตรรกะ (ตัวอย่าง: ทุกคนรู้ว่าผู้หญิงส่วนใหญ่ใช้เวลา 700ms ในการตอบคำถามล้อเล่นแน่นอน) ดังนั้นนี่คือตัวอย่างเล็ก ๆ น้อย ๆ : ลูกค้า: ปัญหาของคุณคืออะไร? Kiku: อย่าใช้สิ่งนั้นกับฉัน! ลูกค้า: #### คุณ Kiku: ทำไมคุณถึงเป็นอย่างนั้นกับฉัน: / อย่างไรก็ตามฉันอยากจะเพิ่มคุณสมบัติแดกดัน ดังนั้นถ้าคุณเขียนอะไรบางอย่างด้วยการเสียดสีเธอก็จะตรวจจับและตอบสนองตามนั้น ตอนนี้เป็นส่วนที่ยุ่งยากคุณจะสอนสคริปท์ได้อย่างไร? ให้ฉันเจาะจงมากขึ้น คำเหน็บแนมที่ใช้กันมากที่สุดในทุกวันนี้คืออะไร? หรือวิธีรับสถิตินั้น ฉันจะทำให้สคริปต์เข้าใจบริบทของวลีที่กำหนดได้อย่างไร UPDATE เนื่องจากคำถามนี้กำลังได้รับความสนใจอย่างมากฉันคิดว่าสิ่งต่างๆควรถูกลบออกไปอีกเล็กน้อย มันชัดเจนมากว่าการทำให้สคริปต์ตรวจสอบการเสียดสีอย่างเต็มที่นั้นเป็นไปไม่ได้ อย่างน้อยก็ในเรื่องที่สมเหตุสมผล แต่ผมไม่เชื่อว่าปริมาณของบางอย่างที่เป็นไปได้ถากถางสามารถตรวจพบได้ ขณะนี้ฉันได้ทำให้มันจนสคริปต์ของฉันสามารถตรวจสอบการเสียดสีที่ จำกัด มาก ฉันกำหนดคำพูดประชดประชันบางอย่างไว้ล่วงหน้า (แต่เพียงอย่างเดียวพวกเขาไร้ประโยชน์) ตัวอย่างเช่น: อะไรก็ได้ใช่ถูกและยิ่งใหญ่ …

2
วิธีการเลือกตัวเลือกที่น่าจะเป็นไปได้มากที่สุดจากรายการตามการป้อนข้อความของผู้ใช้
ฉันกำลังทำงานกับแอปพลิเคชัน OCR ที่ฉันต้องเลือกตัวเลือกตามการป้อนข้อความของผู้ใช้ Ex: Available Options: ["python", "ruby", "java", "clojure", "haskell"] Input: kava Output: java Input: ruby Output: ruby Input: clujuro Output: clojure etc.. แอปพลิเคชันของฉันใช้ภาษาไพ ธ อนมีขั้นตอนวิธีแก้ไขปัญหานี้อยู่แล้ว

3
อัลกอริทึมลิฟต์และการใช้งาน [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Software Engineering Stack Exchange ปิดให้บริการใน5 ปีที่ผ่านมา ฉันอยากรู้ว่าลิฟต์ (จริง) ทำงานอย่างไร แต่จนถึงตอนนี้ฉันไม่สามารถหาข้อมูลเกี่ยวกับอัลกอริทึมที่พวกเขาใช้หรือซอฟต์แวร์ (ถ้ามี) สำหรับการจำลอง ใครช่วยให้ฉันอ้างอิงสำหรับที่?

2
การออกแบบการพิสูจน์ตัวตนสำหรับ REST API
ฉันทำงานกับ API สำหรับบริการ REST ที่ฉันจะผลิตและบริโภค ฉันใช้เวลาไม่กี่วันที่ผ่านมาพยายามหาวิธีจัดการกับการรับรองความถูกต้องอย่างดีและคิดว่าในที่สุดฉันก็คิดอะไรบางอย่าง ฉันกำลังทำสิ่งนี้ตามข้อเท็จจริงต่อไปนี้เกี่ยวกับสแต็กแอปพลิเคชัน: ไคลเอ็นต์ & เซิร์ฟเวอร์อยู่ใน. NET4 (ส่วนลูกค้าในโปรไฟล์ลูกค้า) เซิร์ฟเวอร์แสดงโดยใช้ WCF REST ฉันไม่ต้องการเก็บชื่อผู้ใช้และรหัสผ่านไว้ในหน่วยความจำในแอพ จาก 3 ฉันต้องการใช้รูปแบบการตรวจสอบความถูกต้องของโทเค็นเพื่อให้หลังจากที่ข้อมูลรับรองถูกตรวจสอบโดยเซิร์ฟเวอร์ลูกค้าจะได้รับโทเค็นกลับมาใช้ตลอดช่วงเวลาที่เหลือของแอป (สิ่งนี้จะทำให้ฉันทำสิ่งอื่น ๆ เช่น หมดเวลาผู้ใช้สามารถย้ายผู้ใช้อย่างต่อเนื่องระหว่างเว็บและเดสก์ท็อปเวอร์ชัน ฯลฯ ) หลังจากหาวิธีการโทรซ้ำและป้องกันการรบกวนฉันได้รับสิ่งต่อไปนี้: ก่อนที่ลูกค้าจะพยายามพิสูจน์ตัวตนมันจะสร้างคู่คีย์ Diffie-Hellman โดยใช้ECDiffieHellmanCngคลาส มันจะส่งส่วนสาธารณะของคู่กุญแจผ่านสายพร้อมกับชื่อผู้ใช้และรหัสผ่าน (ผ่าน HTTPS แน่นอน) เซิร์ฟเวอร์รับรองความถูกต้องของชื่อผู้ใช้ / รหัสผ่านหากทำสำเร็จจะทำสิ่งต่อไปนี้: สร้างโทเค็นเซสชันที่ไม่ซ้ำกัน สร้างคู่คีย์ DH ของตนเองและคำนวณความลับที่ใช้ร่วมกันจากพับลิกคีย์ที่ลูกค้าให้ไว้ บันทึกโทเค็นเซสชันความลับที่ใช้ร่วมกันผู้ใช้และเวลา "การกระทำล่าสุด" (ใช้สำหรับหน้าต่างหมดอายุการหมุน) ในฐานข้อมูล ส่งคืนโทเค็นเซสชันคีย์สาธารณะ DH และข้อความยืนยันความสำเร็จในการตรวจสอบความถูกต้อง ไคลเอ็นต์ใช้คีย์ DH จากการตอบสนองคำนวณความลับที่ใช้ร่วมกันและเก็บทั้งโทเค็นและความลับในหน่วยความจำ …

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