Rumah > Java > teks badan

Menyemak pertindihan dua algoritma senarai 2D?

王林
Lepaskan: 2024-02-22 13:55:06
ke hadapan
637 orang telah melayarinya

Editor PHP Baicao membawakan Soal Jawab yang menarik tentang algoritma Java: Bagaimana untuk menyemak elemen pendua dalam dua senarai dua dimensi? Ini adalah salah satu masalah yang sering dihadapi oleh banyak pengaturcara Java dalam pembangunan harian. Melalui perbincangan dan analisis artikel ini, pembaca akan dapat mempelajari tentang penyelesaian yang berbeza dan strategi pengoptimuman, supaya lebih memahami dan menguasai kaedah dan teknik untuk menangani masalah serupa dalam pengaturcaraan Java.

Kandungan soalan

Diberi dua senarai> (dirujuk sebagai a dan b).

Ia kembali: peta, senarai>>

  • Andaikan sebutan a dan b ialah a1, a2, a3,... dan b1, b2, b3...
  • Pilih item sahaja dengan rentetan bertindih dalam elemen b1 dan a1 (senarai)
  • Masukkan kunci = b1, nilai = a1 dalam keputusan.

Sebagai contoh)

define a and b as follows:
a = [a, b, c], [d, e, f], [a, d, f]
b = [a, d], [a], [c], [x]

it returns : 
key        value 
[a,d]    | [a,b,c],[d,e,f],[a,d,f] 
[a]      | [a,b,c],[a,d,f] 
[c]      | [a,b,c] 
[x]      | empty list
Salin selepas log masuk

Malah, panjang senarai dalam a dan b akan sekurang-kurangnya melebihi 100,000. Saya mencuba pendekatan ini menggunakan list.contains tetapi kerumitan masa kes terburuk ialah o(n^3).

Inilah kod saya, saya ingin mengurangkan kerumitan masa algoritma ini ke bawah o(n^2).

 public Map<List<String>, List<List<String>>> compute(List<List<String>> a, List<List<String>> b) {

        Map<List<String>, List<List<String>>> result = new HashMap<>();

        for (List<String> elem : b) {
            result.put(elem, a.stream().filter(e -> e.stream().anyMatch(elem::contains)).toList());
        }
        return result;
    }
Salin selepas log masuk

Penyelesaian

Saya tidak pasti sama ada ada cara untuk mengurangkan ini kepada o(n^2) 以下,但为了将其减少到 o(n^2),我们可以通过 hashmap 减少 <code>list.contains o(n) .get,即 o(1) kerumitan masa.

Adalah disyorkan untuk tidak menyemak contains,而是查找列表 a 中元素的索引,b 元素将获取该索引并获取 a senarai yang sepadan.

Pertama, bina elemen map,其中包含 a sebagai kunci dan nilai sebagai indeks.

map<string, set<integer>> ainset = new hashmap<>();
    
    for (int i = 0; i < a.size(); i++) {
        for (string elem : a.get(i)) {
            set<integer> elementset = ainset.getordefault(elem, new hashset<>());
            elementset.add(i);
            ainset.put(elem, elementset);
        }
     }
Salin selepas log masuk

Ini ialah output ainset, kini kami mempunyai senarai indeks bagi elemen yang dimilikinya.

a=[0, 2], b=[0], c=[0], d=[1, 2], e=[1], f=[1, 2]
Salin selepas log masuk

Kemudian kita akan b 中元素列表的索引组合起来,得到 a elemen yang sepadan.

Sebagai contoh, untuk [a, d],我们有一个组合集 [0, 1, 2]. Inilah kodnya

Map<List<String>, List<List<String>>> result = new HashMap<>();

    for (List<String> elem : b) {
        Set<Integer> elemSet = new HashSet<>();
        for (String elemB: elem) {
            elemSet.addAll(aInSet.getOrDefault(elemB, new HashSet<>()));
        }
        List<List<String>> listContainElem = elemSet.stream()
            .map(a::get)
            .collect(Collectors.toList());
        result.put(elem, listContainElem);
    }
Salin selepas log masuk

Atas ialah kandungan terperinci Menyemak pertindihan dua algoritma senarai 2D?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!