Thuật toán Grover được áp dụng cho cơ sở dữ liệu như thế nào?


12

Câu hỏi

Tôi muốn sử dụng Thuật toán Grover để tìm kiếm một cơ sở dữ liệu chưa được sắp xếp cho một phần tử x . Bây giờ câu hỏi đặt ra, làm thế nào để tôi khởi tạo chỉ mục và giá trị của cơ sở dữ liệu với các qubit?

Thí dụ

  • Hãy nói rằng tôi có 4 qubit. Do đó, 24=16 giá trị cổ điển có thể được ánh xạ.
  • Cơ sở dữ liệu chưa được sắp xếp của tôi d có các yếu tố sau: d[Value]=[3,2,0,1] .
  • Tôi muốn tìm kiếm x=2d=10b=|10 .
  • Cách tiếp cận của tôi: lập chỉ mục cơ sở dữ liệu d với d[(Index, Value)]=[(0,3),(1,2),(2,0),(3,1)] . Thanh ghi 01 cho chỉ mục và thanh ghi 23 cho giá trị. Sau đó, chỉ áp dụng Thuật toán Grover cho các thanh ghi 23(Value) . Điều này có thể được nhận ra? Có cách tiếp cận nào khác không?

Những gì tôi đã thực hiện ( trên GitHub )

"Thuật toán Grover với 2-, 3-, 4-Qubits", nhưng những gì nó làm rất đơn giản: các bit được khởi tạo với |0 , nhà tiên tri sẽ đánh dấu giải pháp của tôi x (mà chỉ là một số mặt hàng như 2d=10b ), phần Grover sẽ tăng khả năng thành phần được chọn x và giảm tất cả các xác suất khác và sau đó các qubit được đọc ra bởi con người ánh xạ tới các bit cổ điển. Chúng tôi để quá trình này chạy nhiều lần liên tiếp và do đó có được phân phối xác suất, trong đó xác suất cao nhất có phần tử x tìm kiếm của chúng tôi .

Đầu ra luôn giống như đầu ra được đánh dấu trong lời sấm. Làm cách nào tôi có thể tạo thêm thông tin từ đầu ra mà tôi không biết tại thời điểm tôi xây dựng nhà tiên tri?

Câu trả lời:


9

Tôi cũng đang làm việc về vấn đề này. Là người mới bắt đầu và là một lập trình viên cổ điển (nghĩa là tôi không nói Cơ học lượng tử), thật khó để hiểu được các khái niệm mà không có ví dụ hoàn chỉnh. Tôi đã làm việc với mẫu Tìm kiếm cơ sở dữ liệu của Microsoft Q # . Nó chỉ đơn giản là tìm kiếm một chỉ mục / khóa cụ thể trong cơ sở dữ liệu, không hữu ích lắm. Tôi đã mở rộng dựa trên mẫu đó để tìm kiếm danh sách các giá trị trong cơ sở dữ liệu và trả về khóa tương ứng.

Như với ví dụ của bạn, có một "thanh ghi khóa" hai qubit cho các chỉ mục và một thanh ghi hai qubit riêng cho các giá trị. Ngoài ra còn có một "qubit được đánh dấu" thứ năm đến từ mẫu của Microsoft, để cho biết khi nào tìm thấy giá trị mong muốn. Các khóa và giá trị được liên kết thông qua sự vướng víu. Điều đó được thể hiện tốt nhất với một mạch. Nhấn vào đây để xem mạch Quirk thực tế .

Key/Value Oracle Circuit

Lưu ý rằng mạch này chỉ chứa các lời tiên tri. Nó không thực hiện tất cả các thuật toán của Grover.

  • Hai qubit trên cùng là thanh ghi chính, hai qubit tiếp theo là thanh ghi giá trị và qubit dưới cùng là qubit được đánh dấu.
  • Phần đầu tiên đặt thanh ghi khóa vào vị trí chồng đồng nhất bằng cách sử dụng cổng Haramard, theo yêu cầu của thuật toán Grover.
  • Phần thứ hai là nơi các khóa được liên kết với các giá trị thông qua sự vướng víu. Mỗi khóa được vướng với một giá trị tương ứng trong thanh ghi giá trị bằng cách áp dụng các cổng X được điều khiển (Chống). Vì vậy, khi thanh ghi khóa là 0, thì thanh ghi giá trị sẽ được đặt thành 3. Khi khóa là 1, giá trị được đặt thành 2, v.v.
  • Phần thứ ba của mạch là nhà tiên tri tìm kiếm. Thanh ghi giá trị bị vướng với qubit được đánh dấu. Trong ví dụ này, giá trị mong muốn là 2. Khi thanh ghi giá trị chứa 2, qubit được đánh dấu sẽ được đặt thành 1.
  • Thuật toán của Grover xem xét thanh ghi khóa và qubit được đánh dấu. Nhà tiên tri tìm kiếm nhìn vào thanh ghi giá trị và đặt qubit được đánh dấu. Điều này sẽ khiến khóa 1 được khuếch đại khi giá trị là 2.

Thật thú vị khi lưu ý rằng các khóa và giá trị không được lưu trữ trong các qubit, mà là trong mạch / chương trình. Bạn có thể nói nó không thực sự là một cơ sở dữ liệu. Nó giống như một câu lệnh chuyển đổi / trường hợp, nhưng một câu lệnh có thể chạy trên sự chồng chất của các giá trị.

Để biết thêm chi tiết, hãy cẩn thận và mã Q #, xem kho GitHub của tôi .

EDIT: Một cái gì đó tôi hiểu rõ hơn kể từ khi trả lời ... bạn phải đảo ngược / hoàn tác mạch như một phần của mỗi lần lặp. Trong mã Q #, lệnh gọi Adjoint StatePreparationOracle () trong hoạt động ReflectStart () xử lý việc này, vì vậy tôi không phải thực hiện một cách rõ ràng. Tôi không biết nếu Qiskit có một tính năng tương tự. Nếu tôi đã thực hiện đúng bản dịch, đây là một mạch hoàn chỉnh cho ví dụ trên.


Cảm ơn! Đó chính xác là những gì tôi đang tìm kiếm.
alex

Vì vậy, đối với Grover-Part: Tôi chỉ phải thực hiện các công cụ khuếch đại với các thanh ghi chính (2 qubit trong ví dụ này)? Làm thế nào chúng được kết nối với qubit được đánh dấu?
alex

Theo mẫu Q #, "Thuật toán của Grover yêu cầu phản ánh về trạng thái được đánh dấu và trạng thái bắt đầu", vì vậy bạn cần phải hoạt động với cả qubit được đánh dấu và thanh ghi khóa. Nếu bạn theo mã trong hoạt động QuantumSearch (), bạn sẽ thấy ReflectMarked () được gọi chỉ với qubit được đánh dấu. ReflectZero () sau đó cũng được gọi với sự kết hợp của qubit được đánh dấu và thanh ghi khóa. Ngoài ra, vui lòng xem Chỉnh sửa ở trên.
Joel Leach

3

Khi trình bày thuật toán của Grover như được áp dụng cho tìm kiếm trong cơ sở dữ liệu, người ta cho rằng Oracle có quyền truy cập vào các yếu tố của danh sách cổ điển. Tuy nhiên, đó là một giả định rất mạnh mẽ và đây là lý do tại sao chúng tôi đại diện cho điều đó bởi một bộ chọn có kiểm soát sử dụng CNOT / Toffolis của một chỉ số đại diện cho thao tác này (như mạch Toffoli trong trường hợpn= =4).

Bạn đề cập đến cách tiếp cận tính toán các giá trị trong một thanh ghi khác:

ΣTôi|Tôi|d(Tôi)
Bạn giả sử một lần nữa, bạn được ban cho một lời tiên tri để làm như vậy và hiệu quả (một cách đơn giản là kiểm soát-KHÔNG nhưng bạn phải làm điều này cho mọi chỉ số / giá trị nên không hiệu quả lắm). Trong trường hợp này, nhà tiên tri sẽ là chức năngf(Tôi)= =2 trong một định dạng mạch lượng tử (một lần nữa là bộ chọn điều khiển), đánh dấu trạng thái này và tiếp tục với các lần lặp Grover.

Tôi nghĩ tốt hơn là nghĩ về thuật toán tìm kiếm lượng tử là tối ưu hóa một chức năng, thay vì tìm kiếm trong danh sách / cơ sở dữ liệu. Dưới đây là một bài viết tôi đã làm việc về việc tìm kiếm lượng tử được sử dụng để giải quyết vấn đề tối đa hóa tổ hợp nếu bạn muốn theo đuổi sự hiểu biết sâu hơn về thuật toán.


Cảm ơn bạn đã trả lời của bạn! Vì vậy, Thuật toán Grover ít phù hợp hơn cho tìm kiếm cơ sở dữ liệu. Tôi tìm thấy một câu hỏi liên quan ở đây .
alex

Có mã giả (hoặc mã Qiskit) để giải quyết vấn đề tìm kiếm DB này không?
alex

Bạn sẽ phải tìm nhưng điều đó sẽ dễ dàng tìm thấy trong số các khung.
cnada 16/03/19

3

Bạn cũng cần phải chuyển đổi nhà tiên tri để giữ cơ sở dữ liệu, do đó, Oracle chung (Đảo ngược pha) sẽ có hai nhà tiên tri phụ hãy xem hình. General Grover's algorithm circuit for database searching

Tiểu thuyết đầu tiên phải chuẩn bị là mạch nhớ, trái ngược với QRAM lưu trữ dữ liệu lượng tử (trạng thái) trong cơ thể, mạch nhớ (mảng) này được chuẩn bị để chỉ lưu trữ thông tin cổ điển trong khung của nó. Một ví dụ về loại mạch như vậy lưu trữ một mảng nhị phân [010, 110, 100, 011] được hiển thị bên dưới: example for a memory circuit Để biết thêm hãy đọc bài viết này .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.