Tôi có một mạng lưới các (d) kích thước, tất cả các khía cạnh được phân chia bằng đồng bằng = 0,25Tìm kiếm một mạng lưới các điểm, cách truy cập vào từng điểm một lần duy nhất
Một ví dụ về lưới này là con số này (d đây là 2, và mỗi chiều là bình thường 0-1):
mỗi ngã tư đại diện cho 1 điểm, ví dụ, điểm ở giữa được biểu diễn dưới dạng:
double[] A={0.5, 0.5};
Câu hỏi của tôi là: Tôi muốn tìm kiếm lưới này, bắt đầu từ điểm đầu vào A và các điểm lân cận của nó. Sau đó tiếp tục làm điều đó. Với một điều kiện: Mỗi điểm chỉ được truy cập một lần.
Để làm rõ hơn, hãy xem xét ví dụ sau: Điểm khởi đầu là:
double[] A={0.5, 0.5};
Vì vậy, A sẽ được kiểm tra đầu tiên, sau đó các nước láng giềng được tạo ra và chèn vào một Queue (hàng đợi được sắp xếp dựa trên một hàm f).
Đây điểm A là vòng tròn tối. Những người hàng xóm của nó là các vòng tròn màu xanh lá cây:
{0.25, 0.25}
{0.25, 0.5}
{0.25, 0.75}
..
..
..
{0.75, 0.75}
Bây giờ, thuật toán lặp lại cho đến khi Hàng đợi trở nên trống. Trong vòng lặp, điểm trên cùng bị xóa (pop()), sau đó được chọn, sau đó được chọn hàng xóm được thêm vào Hàng đợi.
Ví dụ, trong vòng lặp đầu tiên, vòng tròn màu xanh đã xảy ra với là điểm hàng đầu trong Queue. Nó được lấy ra khỏi hàng đợi, sau đó kiểm tra, sau đó hàng xóm của nó (vòng tròn màu đỏ) được tạo ra và thêm vào hàng đợi.
Vấn đề ở đây là, mã của tôi tạo điểm lân cận, không biết liệu điểm trước đó có được truy cập trước đó hay không.
và tôi không thể lưu giữ danh sách các điểm đã truy cập trước đó và kiểm tra điểm mỗi lần tạo điểm mới (với kích thước cao và độ phân giải cao, d = 8 và delta = 0.03125, sẽ mất bao giờ!)
Đây là thuật toán tìm kiếm:
public void search(int d, double delta, double[] inpoint)
{
Queue queue = new Queue();
queue.push(inpoint);
while(!queue.isEmpty())
{
// remove top point from Queue
double[] a = queue.pop();
// Check point a and do some calculations
// ;;;;;;;;;;;;;;;;
// Generate neighbours of current point:
ArrayList<double[]> neighbors = new ArrayList<double[]>();
nextMoves(a, new double[d], delta, d, neighbors);
// For each point in neighbors, push to Queue:
for(int i=0 ; i < neighbors.size(), i++)
queue.push(neighbors.get(i));
}
}
Và đây là các thuật toán để tạo ra những người hàng xóm, nó là một thuật toán đệ quy.
public static void nextMoves(double[] inatt, double[] outatt, double delta, int d, ArrayList<double[]> neighbors)
{
if(d == inatt.length)
{
if(!outOfBound(outatt,d))
{
moves.add(outatt);
}
}
else
{
// first case: add delta:
outatt[d] = inatt[d]+delta;
nextMoves(inatt, outatt, delta, d+1, moves);
// second case: subtract delta:
outatt[d] = inatt[d]-delta;
nextMoves(inatt, outatt, delta, d+1, moves);
// third case: no change:
outatt[d] = inatt[d];
nextMoves(inatt, outatt, delta, d+1, moves);
}
}
Như tôi đã đề cập trước đây, việc lưu danh sách các điểm truy cập trước đây không phải là giải pháp khả thi. Nếu tôi làm điều này, danh sách trở nên rất lớn khi tôi có chiều cao và độ phân giải cao. Và danh sách này sẽ phải được tìm kiếm theo đường thẳng mỗi khi một điểm được tạo!
Có lẽ tôi nên tổ chức danh sách này trong chỉ mục không gian? Tôi không biết ... Tôi sẽ đánh giá cao ý kiến của bạn.
Bạn có thể cho chúng tôi biết hoạt động nào bạn định thực hiện tại mỗi điểm không? Tôi nghi ngờ rằng có bất kỳ vấn đề thế giới thực nào mà bạn dự định "ghé thăm" từng điểm mà không làm gì đó ở đó. –
'Và danh sách này sẽ phải được tìm kiếm một cách tuyến tính mỗi khi một điểm được tạo ra' ... không, bạn sẽ không phải tìm kiếm toàn bộ danh sách để kiểm tra điểm trùng lặp nếu bạn chỉ đơn giản là _access_ một mảng bằng cách sử dụng điểm trong câu hỏi. –
Lớp Queue của bạn có phải là FIFO (lần đầu tiên ra trước) không? và nó có cho phép kiểm tra xem phần tử đã có trong Queue không? –