- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试从大小为 7,140,000 的 ArrayList 中删除 140,000 个对象。我预计这会花费几秒钟(如果那样的话),但 Java 每千个对象花费几秒钟。这是我的代码:
for (int i = list.size(); i > P; i--)
{
int size = list.size();
int index = (int) (Math.random() * size);
list.remove(index);
}
Để ý:P 是我之前设置为 7,000,000 的常数。
循环的目标是从列表中随机删除对象,直到其大小为 7,000,000。
Java 需要这么长时间是因为我从超过 700 万个对象开始吗?过去我从来没有注意到从 ArrayLists 中删除的效率问题。如果有帮助,我会使用 DrJava Beta IDE。
câu trả lời hay nhất
每次从 ArrayList 中删除一个元素时,它都必须将所有具有更大索引的元素向下打乱一个位置。假设您删除了 7M 元素列表的第一个元素 - 然后您还必须移动 6,999,999 个元素。
如果您在循环中执行此操作,则需要 O(n^2)
时间,在哪里N
是列表的大小。对于 700 万个元素的列表,这会非常慢。
相反,如果您事先知道要删除哪些元素,则可以一次将所有元素向下移动:
int dst = 0;
for (int src = 0; src < list.size(); ++src) {
if (!toRemove(src)) {
list.set(dst++, list.get(src));
}
}
list.subList(dst, list.size()).clear();
哪里toRemove(src)
是一些函数,它表示您是否要删除 nguồn
-th 元素。
例如,您可以构造一个 BitSet
NgoàiP
元素集:
BitSet toRemove = new BitSet(list.size());
for (int i = list.size(); i > P; i--) {
int rand;
LÀM {
rand = Math.random() * list.size();
} while (toRemove.get(rand));
toRemove.set(rand, true);
}
如果您只是从 7M 元素列表中删除零元素,您仍然需要将所有 6,999,999 个元素向右移动;但任何其他删除都不需要在顶部进行任何更多的转换。这个算法是O(n)
,其中 n 是列表的大小。
编辑:您可以选择 P
列表中的元素(其中 P <= list.size()
)如下所示:
int dst = 0;
Random rand = new Random();
for (int src = 0; dst < P; ++src) {
if (rand.nextInt(list.size() - src) < (P-dst)) {
list.set(dst++, list.get(src));
}
}
list.subList(dst, list.size()).clear();
此策略将以相等的概率 (*) 从列表中选择元素,并且适用于 P
的任何值。 ;它还保留了原始顺序。
如果要 sample K
带有 N
的列表中的项目没有两次绘制相同元素的项目,有choose(N, K) = N! / (K! * (N-K)!)
方法来做到这一点。如果你想以相同的概率从列表中选择所有元素,那么你应该选择这些 c(n,k)
中的任何一个。不同的配置。
当有 tôi
待挑选的元素 N
项,您将:
k-1
剩余的元素 n-1
项目;或tôi
剩余的元素 n-1
项目。为了保证等概率的挑到K
元素整体,需要根据组合的个数在两个选项中选择一个从n-1
中挑选元素:
#(combinations after taking first item)
P(take first item) = ------------------------------------------------------------------
#(combinations after taking) + #(combinations after not taking)
= C(n-1,k-1) / (C(n-1, k-1) + C(n-1, k))
= ... working omitted ...
= k / n
所以,当你有 tôi
需要从 N
拿走的元素, 你应该拿第一项 k/n
的时间。
需要指出的两个有趣案例是:
k == n
, k/n = 1
,所以你总是取元素。直觉上,如果你必须选择 N
N
中的项目,你必须把它们全部拿走。k == 0
, k/n = 0
,所以你mãi mãi取元素。直觉上,如果您已经选择了所有 K
您的元素,您不需要再拿走。要实现这一点,您可以简单地生成一个均匀分布的随机数 r
hiện hữu [0..n)
范围内, 如果 r < k
则从列表中“取出”元素.
就上述实现而言,k = P - dst
, 和 n = list.size() - src
.
关于java - 在 Java ArrayList 中删除对象 - 耗时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46419578/
Một trong những giáo sư của tôi đã đưa cho chúng tôi một số câu hỏi thực hành và một trong những câu hỏi có dạng như sau (mã giả): a.setColor(blue); b.setColor(red);
Tôi dường như sử dụng bài kiểm tra này rất nhiều if( object && object !== "null" && object !== "unknown" ){ doSomething() } Trên một đối tượng, tôi
Đối tượng/đối tượng C# là loại giá trị hay loại tham chiếu? Tôi đã kiểm tra xem họ có thể giữ tham chiếu này không, nhưng tham chiếu này không thể được sử dụng để thay đổi đối tượng. sử dụng Hệ thống; lớp MyClass { public s
Tôi gặp sự cố khi gửi json qua AJAX. var data = [{"name": "Will", "họ": "Smith", "age": "40"},{"name": "Wil
Khi tôi cố gắng truy cập đối tượng {{result}} trong Chế độ xem của mình (mà tôi đang gửi từ máy chủ Express js), nó chỉ hiển thị [object][object] Có ai biết cách lấy giá trị ở định dạng JSON không? Đây là
Tôi có nhiều loại dữ liệu khác nhau (có thể là chuỗi, số nguyên ...). Đây là một ví dụ đơn giản: public static void main(String[] args) { before("one" }
Xin chào, tôi mới làm quen với json và javascript. Tôi đã tìm ra cách sử dụng dữ liệu json làm bảng trên trang web này. Tôi tò mò tại sao khi tôi cố gắng sử dụng dữ liệu json làm bảng, tôi lại nhận được [Object,Object]
Đã đóng cửa. Sự cố này yêu cầu chi tiết gỡ lỗi. Câu trả lời không được chấp nhận vào thời điểm này. Chỉnh sửa câu hỏi để bao gồm hành vi mong muốn, một vấn đề hoặc lỗi cụ thể và
Tôi nghe người khác nói rằng null == object tốt hơn object == null check. Ví dụ: void m1(Object obj) { if(null == obj) // Is thi.
Đối tượng Match cung cấp quyền truy cập vào các thuộc tính chỉ đọc của các kết quả khớp biểu thức chính quy. Lưu ý rằng các đối tượng Match chỉ có thể được tạo thông qua phương thức Thực thi của đối tượng RegExp, phương thức này thực sự trả về một tập hợp các đối tượng Match. tất cả
Đối tượng lớp Một đối tượng được tạo bằng câu lệnh Lớp. Cung cấp quyền truy cập vào các sự kiện khác nhau của lớp. Giải thích Không được phép khai báo rõ ràng một biến là loại Lớp. Trong ngữ cảnh của VBScript, thuật ngữ "đối tượng lớp" dùng để chỉ
Đối tượng Thư mục cung cấp quyền truy cập vào tất cả các thuộc tính của một thư mục. Giải thích rằng đoạn mã sau minh họa cách lấy một đối tượng Thư mục và xem các thuộc tính của nó: Hàm ShowDateCreated(f
Đối tượng File cung cấp quyền truy cập vào tất cả các thuộc tính của tệp. Đoạn mã sau minh họa cách lấy một đối tượng File và xem các thuộc tính của nó: Hàm ShowDateCreated(fil
Đối tượng Drive cung cấp quyền truy cập vào các thuộc tính của ổ đĩa hoặc mạng chia sẻ. Mô tả Đoạn mã sau minh họa cách sử dụng đối tượng Drive để truy cập các thuộc tính của ổ đĩa: Hàm ShowFreeSpac
Các đối tượng FileSystemObject cung cấp quyền truy cập vào hệ thống tệp của máy tính. Đoạn mã sau minh họa cách sử dụng đối tượng FileSystemObject để trả về một đối tượng TextStream có thể đọc được
Tôi mới làm quen với javascript OOP và tôi nghĩ đây là một câu hỏi tương đối cơ bản nhưng tôi không thể tìm thấy bất kỳ trợ giúp nào bằng cách tìm kiếm trên web. Tôi có thiếu thứ gì đó không, hay tôi đang đi sai hướng? Đây là mã mẫu của tôi: funcio
Tôi có thể tạo ra rất nhiều đồ vật khác nhau một cách dễ dàng. Ví dụ như thế này: var myObject = { myFunction: function () { return "" } };
hàm Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = hàm()
Có ai có thể giải thích cho tôi tại sao đoạn mã sau lại đưa ra (đối tượng, đối tượng) không? (console.log(dope) cung cấp những gì cần thiết, nhưng trong JSON.stringify và JSON.parse
Tôi đang cố gắng hoàn thành bài tập về biểu đồ phân tán từ Free Code Camp. Tuy nhiên, tôi mới chỉ tự học d3 được vài giờ và tôi đang cố gắng tìm ra cách hiển thị dữ liệu cụ thể trong chú giải công cụ sau khi làm theo hướng dẫn từ lynda.com. Mã này
Tôi là một lập trình viên xuất sắc, rất giỏi!