- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
Đối với các phần tử trong mảng/danh sáchx
Việc sắp xếp được thực hiện chỉ để tìm ra có bao nhiêu phần tử trong mảng/danh sách nhỏ hơn x.
Vì vậy, xếp hạng một danh sách là xếp hạng tất cả các phần tử trong danh sách.
例如,hạng [51, 38, 29, 51, 63, 38] = [3, 1, 0, 3, 5, 1]
, tức là có 3 phần tử nhỏ hơn 51, v.v.
Việc sắp xếp danh sách có thể được thực hiện trong O(nlogn). Về cơ bản, chúng ta có thể sắp xếp danh sách trong khi ghi nhớ chỉ mục gốc của từng phần tử, sau đó xem số lượng chỉ mục trước mỗi phần tử.
Câu hỏi ở đây là làm thế nào đểO(NlogN)
hậu tố trong danh sách được sắp xếp?
Sắp xếp danh sách theo hậu tố có nghĩa là:
Đối với danh sách [3;1;2], xếp hạng [[3;1;2];[1;2];[2]]
Lưu ý rằng các yếu tố có thể không rõ ràng.
biên tập
Chúng ta không cần in ra tất cả các phần tử có đủ hậu tố. Bạn có thể tưởng tượng rằng chúng ta chỉ cần in ra một danh sách/mảng trong đó mỗi phần tử là một nhóm cột có hậu tố.
Ví dụ: Rank suffix_u of_3;1;2]=rank[[3;1;2];[1;2];[2]]=[2;0;1] thì bạn chỉ cần in ra [2;0; 1].
编辑2
Hãy để tôi giải thích rõ hơn ở đây tất cả các hậu tố là gì và sắp xếp/sắp xếp tất cả các hậu tố là gì.
Giả sử chúng ta có một mảng/danh sách [e1;e2;e3;e4;e5].
Khi đó tất cả các hậu tố của [e1; e2; e4; e5] là:
[E1;E2;E3;E4;E5]
[E2;E3;E4;E5]
[E3;E4;E5]
[E4;E5]
[E5]
Ví dụ: tất cả các hậu tố của [4;2;3;1;0] đều là
[4;2;3;1;0]
[2;3;1;0]
[3;1;0]
[1;0]
[0]
Sắp xếp với hơn 5 hậu tố có nghĩa là phân loại từ điển. Sắp xếp tất cả các hậu tố bạn sẽ nhận được
[0]
[1;0]
[2;3;1;0]
[3;1;0]
[4;2;3;1;0]
Nhân tiện, nếu bạn không thể tưởng tượng được 5 danh sách/mảng có thể được sắp xếp giữa chúng, thì hãy nghĩ đến việc sắp xếp các chuỗi theo từ điển.
"0"<"10"<"2310"<"310"<"42310"
Có vẻ như việc sắp xếp tất cả các hậu tố thực sự sắp xếp tất cả các phần tử của mảng ban đầu.
Tuy nhiên, xin lưu ý rằng tất cả các phần tử có thể không hoàn toàn khác nhau, ví dụ:
Đối với [4;2;2;1;0], tất cả các hậu tố là:
[4;2;2;1;0]
[2;2;1;0]
[2;1;0]
[1;0]
[0]
Sau đó, thứ tự là
[0]
[1;0]
[2;1;0]
[2;2;1;0]
[4;2;2;1;0]
câu trả lời hay nhất
Như mbo đã chỉ ra một cách chính xác, câu hỏi của bạn là về việc xây dựng danh sách đầu vàomảng hậu tố. Để làm điều này, thuật toán nhanh và phức tạp thực sự là thời gian tuyến tính, nhưng vì bạn chỉ nhắm mục tiêuO(n log n)
, Tôi sẽ cố gắng đưa ra một phiên bản đơn giản hơn, dễ thực hiện hơn.
Ý tưởng cơ bản và triển khai ban đầu
theo trình tựO(n log2 n)
Ví dụ. Hậu tố của nó là
0: 4 2 2 1
1: 2 2 1
2: 2 1
3:1
[4, 2, 2, 1]
Sắp xếp theo so sánh. Vì vậy, câu hỏi vẫn là làm thế nào để chúng ta so sánh nhanh chóng hai hậu tố?
O(n log n)
Và
[2, 2, 1]
. Chúng ta có thể điền những giá trị làm thay đổi kết quả so sánh bằng các giá trị vô cực âm:
[hai mươi mốt]
Và
[2, 2, 1, -∞]
.
[a, b, c, d] < [e, f, g, h]
<=> ([a, b], [c, d]) < ([e, f], [g, h])
<=> [a, b] < [e, f] hoặc ([a, b,] = [e, f] và [c, d] < [g, h])
[2, 1, -∞, -∞]
. Mỗi chuỗi con có thể được biểu thị bằng vị trí bắt đầu của nó trong danh sách ban đầu. Chúng tôi sắp xếp chúng bằng cách sắp xếp so sánh đơn giản và nhận được
[4], [2], [2], [1]
. Chúng ta lưu trữ kết quả bằng cách gán chúng vào từng vị trí trong danh sách đã sắp xếp:
thứ hạng chuỗi con vị trí
0 [4] 2
1 [2] 1
2 [2] 1
3 [1] 0
vị trí chuỗi con một nửa xếp hạng từ bước 1 xếp hạng cuối cùng
0 [4, 2] ([4], [2]) (2, 1) 3
1 [2, 2] ([2], [2]) (1, 1) 2
2 [2, 1] ([2], [2]) (1, 0) 1
3 [1, -∞] ([1], [-∞]) (0, -∞) 0
vị trí một nửa chuỗi con xếp hạng từ bước 2 xếp hạng cuối cùng
0 [4, 2, 2, 1] ([4, 2], [2, 1]) (3, 1) 3
1 [2, 2, 1, -∞] ([2, 2], [1, -∞]) (2, 0) 2
2 [2, 1, -∞, -∞] ([2, 1], [-∞,-∞]) (1, -∞) 1
3 [1, -∞, -∞, -∞] ([1,-∞], [-∞,-∞]) (0, -∞) 0
[1], [2], [2], [4]
, chúng tôi cần
2^k
bước chân. Hoặc ngược lại, chúng ta cần
k
Các bước xử lý kích thước
log_2 n
sự liên tiếp. Nếu độ dài của nó không phải là lũy thừa của hai, chúng ta sẽ thêm vào nó một âm vô cực.
n
đã biên soạn):
#include
#include
using namespace std;
int seq[] = {8, 3, 2, 4, 2, 2, 1};
const int n = 7;
const int log2n = 3 // log2n = ceil(log_2(n))
int Rank[log2n + 1][n]; // Rank[i] sẽ lưu lại Rank cuối cùng của bước i
tuple L[n]; // L là danh sách các bộ dữ liệu ở bước i,
// cái này sẽ giữ các cặp Xếp hạng từ bước i - 1
// cùng với chỉ mục chuỗi con
const int neginf = -1; // phải nhỏ hơn tất cả các số trong seq
int chính() {
vì (int i = 0; i < n; ++i)
Rank[1][i] = seq[i]; // bước 1 thực sự đơn giản nếu bạn nghĩ về nó
for (int step = 2; step <= log2n; ++step) {
int length = 1 << (bước - 1); // độ dài là 2^(bước - 1)
vì (int i = 0; i < n; ++i)
L[i] = make_tuple(
Xếp hạng[bước - 1][i],
(i + chiều dài / 2 < n) ? Xếp hạng[bước - 1] [i + chiều dài / 2] : phủ định,
i); // sau này chúng ta cần biết tuple đến từ đâu
Sort(L, L + n); // sắp xếp theo từ điển
vì (int i = 0; i < n; ++i) {
// chúng ta lưu thứ hạng của chỉ mục, nhưng chúng ta cần cẩn thận
// gán thứ hạng bằng nhau cho các cặp bằng nhau
Xếp hạng[bước][get<2>(L[i])] = (i > 0 && get<0>(L[i]) == get<0>(L[i - 1])
&& get<1>(L[i]) == get<1>(L[i - 1]))
? Xếp hạng[bước][get<2>(L[i - 1])]
:Tôi;
}
}
// mảng hậu tố nằm trong L sau bước cuối cùng
vì (int i = 0; i < n; ++i) {
int bắt đầu = get<2>(L[i]);
cout << bắt đầu << ://;
cho (int j = bắt đầu; j < n; ++j)
cout << " " << seq[j];
cout << endl;
}
}
6:1
5: 2 1
4: 2 2 1
2: 2 4 2 2 1
1: 3 2 4 2 2 1
3: 4 2 2 1
0: 8 3 2 4 2 2 1
-std=c++11
, trong việc thực hiện này nó là
O(log n * (n + sắp xếp))
, bởi vì chúng tôi sử dụng các kiểu so sánh phức tạp
O(n log2 n)
O(n log n)
thuật toán
O(n log n)
Trong phần sắp xếp, bạn sẽ nhận được
TRÊN)
ranh giới. Vì vậy, về cơ bản chúng ta cần sắp xếp một loạt các cặp. Chúng tôi biết chúng tôi có thể sử dụng
sắp xếp đếmhiện hữu
O(n log n)
Sắp xếp một chuỗi các số nguyên trong một phạm vi thời gian nhất định. Chúng ta có thể đặt
(x, y)
dưới dạng số trong cơ số n
0 <= x, y < n
Mã hóa. Bây giờ chúng ta có thể thấy cách sử dụng
Sắp xếp cơ số LSDSắp xếp các cặp này.
TRÊN)
để sắp xếp các cặp, sau đó lại sử dụng cách sắp xếp đếm để tăng
(x, y)
để sắp xếp. Vì việc sắp xếp đếm ổn định nên chúng tôi đưa ra thứ tự các cặp của mình. Sự phức tạp cuối cùng là thế này.
z = n * x + y
实现
tại kho lưu trữ Github của tôi. Việc thực hiện có 27 dòng mã. Khá tốt phải không?
Về thuật toán - hậu tố cho danh sách hoán vị, chúng tôi tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/21220150/
Đây có vẻ là một câu hỏi ngớ ngẩn, nhưng tại sao tồn tại các phiên bản tiền tố và hậu tố của toán tử ++ và -- trong nhiều ngôn ngữ mà không tồn tại phiên bản tiền tố/hậu tố của các toán tử khác như += hoặc -=? Ví dụ: nếu tôi có thể viết mã này: myArray[x+
Tôi cần liên kết tới thư viện chia sẻ được tạo sẵn của bên thứ ba. Trên Windows, điều này có nghĩa là liên kết với Third_party.lib, trên Linux/Android, điều này có nghĩa là liên kết với libThird_party.so. Vì vậy đối với
Tôi đang học nạp chồng toán tử trong C++. Điểm đặc biệt của hậu tố gốc ++ là nó có độ ưu tiên thấp hơn toán tử gán. Ví dụ: int i=0, j=0; i=j++; cout sử dụng không gian tên lớp V;
Cách thêm tiền tố vào mỗi dòng trong vùng văn bản.. Ví dụ: Đây là nội dung của vùng văn bản: hello124 Tôi muốn thêm tiền tố và hậu tố [b] vào mỗi dòng để khi tôi nhấp vào nút, kết quả sẽ là: [b] xin chào[/b] [b]124[
Bối cảnh: Trong ký hiệu đảo ngược truyền thống của Ba Lan, tất cả các toán tử phải có độ dài cố định, điều này cho phép RPN dễ dàng được đánh giá và thao tác bằng mã vì mọi mã thông báo, biểu thức và biểu thức con đều "khép kín" để người ta có thể thay thế y một cách mù quáng trong x y* như
Tôi có Javascript sau được thiết kế để sửa đổi định dạng ngày, tuy nhiên tôi muốn thêm ngày gốc hoặc hậu tố như "st", "nd", "rd", "th" vào mỗi số ngày kết thúc. Ví dụ: giả sử ngày hiện tại của chúng tôi được đặt là ngày 28 tháng 4, nhưng tôi muốn thay đổi ngày
Tôi muốn tạo quy tắc kiểm tra tiêu đề để thêm câu trả lời và thay đổi "từ" thành "không trả lời". Tôi đang sử dụng nó cho một số loại địa chỉ danh sách khuếch tán. Tôi đã thử mã biểu thức chính quy này nhưng nó không hoạt động: if !/^From:(.+@myserver\.f
Tôi muốn thay đổi nội dung cột của khung dữ liệu để nội dung ô có tiền tố là tên cột: > xx VarX VarY 1 AC 2 BD 3 AC 4 BD > x$V
Khi tôi thực thi ipconfig /all, tôi thấy danh sách tìm kiếm hậu tố DNS. Tôi cần truy xuất giá trị này từ java. Có ai biết làm thế nào để có được nó hoặc nó đến từ đâu? Danh sách hậu tố DNS câu trả lời hay nhất được đọc từ HKLM\SYSTEM\Cur
Khi bạn viết một ứng dụng có nhiều lớp, bạn có sử dụng tiền tố/hậu tố cho tên lớp không? Hay tôi chỉ nên dựa vào không gian tên mà tôi đã xác định? Trong trường hợp của tôi, tôi có lớp này: Blur Contrast Sharpen Inv
Hầu hết các trình duyệt sẽ hiển thị một danh sách có thứ tự như thế này: 1. foo 2. bar 3. baz Có cách nào để thay đổi cách đánh số để sử dụng tiền tố thay thế không: #1 foo #2 bar #3 baz Câu trả lời hay nhất Đây là câu trả lời tôi có thể nghĩ ra của Điều tuyệt vời nhất, bạn chỉ có ở Fi
Tôi cần đổi tên hàng loạt nhiều hình ảnh và muốn sử dụng thư mục mẹ làm tên cơ sở. Để ngăn cái này ghi đè lên cái kia, phải thêm một hậu tố. Thứ tự của quá trình đổi tên phải tuân theo dấu thời gian của tệp. Bởi vì tệp "đầu tiên" là hình ảnh nổi bật của trang web tôi đang sử dụng. cây: └── ma
Tôi đang cố gắng sử dụng sed để thay thế một số chuỗi trong một tệp nhưng tôi đang gặp sự cố. Tôi có các chuỗi sau: TEMPLATE_MODULE TEMPLATE_SOME_ERR TEMPLATE_MORE_ERR Tôi muốn sử dụng một số ký tự
Tôi bối rối về mức độ ưu tiên và tính kết hợp của các toán tử hậu tố/tiền tố. Một mặt, khi tôi đọc sách K&R, nó ghi: (*ip)++ Dấu ngoặc đơn là cần thiết trong ví dụ cuối cùng này
Mình có đồ thị có cấu trúc như sau V = {A1, A2, A3, A4, A5, .., An} E = {E1, E2, E3, E4, .., Ek} Bây giờ chúng ta xác định hậu tố của A1: S (A1) = {Tất cả
Đây là mã giải thích. Ngôn ngữ là Java và mã sử dụng Android. fg.setTextSize(height*0.50f); //<-'f' nằm trong ngoặc hoặc @Override pr
đóng cửa. Câu hỏi này lạc đề. Hiện tại nó không chấp nhận câu trả lời. Bạn muốn cải thiện câu hỏi này? Đã cập nhật câu hỏi để nó phù hợp với chủ đề về Stack Overflow. Đóng cửa 9 năm trước Cải thiện điều này
Tôi đang viết lớp mảng của riêng mình như một bài tập. Bởi vì, tôi đọc được rằng các hàm không phải thành viên thực sự tốt hơn các hàm thành viên ở một khía cạnh nào đó. (Scott Meyers) Tôi đang cố gắng viết càng nhiều toán tử quá tải càng tốt bằng các hàm không phải thành viên. Quá tải toán tử +, - như không
Có ai có thể giải thích các ký hiệu trung tố, hậu tố và tiền tố trong ngôn ngữ lập trình C là gì không? Câu trả lời hay nhất Đây là một cuộc thảo luận hay về ba thuật ngữ và cách chúng áp dụng. Ngôn ngữ C sử dụng ký hiệu trung tố ở hầu hết mọi nơi.
Tôi gặp tình huống này: Tôi cần thêm dấu ngoặc kép vào trường văn bản đầu vào (html) mà không thay đổi giá trị của đầu vào. Tôi đang sử dụng góc nên tôi đang sử dụng ngModel và có vẻ như thế này. Tôi muốn trường nhập hiển thị "Mọi thứ bên trong {{data}}
Tôi là một lập trình viên xuất sắc, rất giỏi!