Tìm kiếm nhị phân trong một tệp văn bản được sắp xếp


13

Tôi có một tập tin được sắp xếp lớn với hàng tỷ dòng có độ dài thay đổi. Đưa ra một dòng mới, tôi muốn biết số byte nào sẽ nhận được nếu nó được bao gồm trong tệp được sắp xếp.

Thí dụ

a\n
c\n
d\n
f\n
g\n

Với đầu vào 'foo', tôi sẽ nhận được đầu ra 9.

Điều này rất dễ thực hiện bằng cách chỉ cần đi qua toàn bộ tệp, nhưng là hàng tỷ dòng có độ dài thay đổi sẽ nhanh hơn để thực hiện tìm kiếm nhị phân.

Liệu một công cụ xử lý văn bản như vậy đã tồn tại?

Biên tập:

Hiện tại: https://gitlab.com/ole.tange/tangetools/blob/master/bsearch/bsearch


Bao lâu là dòng mà bạn đang tìm kiếm (tính bằng ký tự)? và bạn cần tìm kiếm bao nhiêu dòng như vậy?
gogoud

@gogoud Tôi không tìm kiếm một công cụ giới hạn, nhưng một công cụ hoạt động trên bất kỳ tệp văn bản nào (bất kể độ dài dòng hoặc số dòng).
Ole Tange

đối với những người có thể muốn tạo đầu vào khổng lồ như vậy: unix.stackexchange.com/a/279098/9689
Grzegorz Wierzowiecki

Câu trả lời:


4

Tôi không biết một số công cụ tiêu chuẩn làm việc này. Tuy nhiên bạn có thể viết của riêng bạn. Ví dụ kịch bản ruby ​​sau đây nên thực hiện công việc.

file, key = ARGV.shift, ARGV.shift
min, max = 0, File.size(file)

File.open(file) do |f|
  while max-min>1 do
    middle = (max+min)/2
    f.seek middle
    f.readline
    if f.eof? or f.readline>=key
      max = middle
    else
      min = middle
    end
  end
  f.seek max
  f.readline
  p f.pos+1
end

Có một chút khó khăn vì sau khi tìm kiếm, bạn thường ở giữa một số dòng và do đó cần phải thực hiện một dòng đọc để đến đầu dòng sau, bạn có thể đọc và so sánh với khóa của mình.


Nó có thể được thay đổi để chấp nhận -n / -r để xử lý các tệp được sắp xếp theo sort -rsort -nkhông?
Ole Tange

Các mã ở trên chủ yếu là để hiển thị ý tưởng. Nó là xa hoàn hảo. (Ví dụ: nó không thành công nếu khóa đi đến vị trí đầu tiên.) Hãy thoải mái thích nghi với nhu cầu của bạn.
michas

5

(Đây không phải là một câu trả lời chính xác cho câu hỏi của bạn, chỉ là một điểm khởi đầu.)

Tôi đã sử dụng sgrep (grep được sắp xếp) trong một tình huống tương tự.

Thật không may (chúng ta cần trạng thái hiện tại) nó không có đầu ra bù byte; nhưng tôi nghĩ rằng nó có thể dễ dàng được thêm vào.


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.