第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

我想替換 Stream Api 中的 BigInteger for 循環(huán)

我想替換 Stream Api 中的 BigInteger for 循環(huán)

烙印99 2023-03-17 15:36:56
想要替換 Java Stream API 中的 BigInteger 循環(huán)。在代碼下方,我必須使用 Stream API 在 java8 中進(jìn)行修改。因?yàn)樾阅軉?wèn)題。我的問(wèn)題是將以下代碼更改為最佳性能的最佳做法是什么。public BigInteger getSum(BigInteger n, BigInteger c) {    BigInteger sum = BigInteger.ZERO;    for (BigInteger i = BigInteger.ZERO; i.compareTo(n) < 0; i=i.add(BigInteger.ONE)) {        sum = sum.add(calculateProduct(i, i.subtract(BigInteger.ONE), c));    }    return sum;}private BigInteger calculateProduct(BigInteger i, BigInteger j, BigInteger c) {    if (j.compareTo(BigInteger.ZERO) < 0) return BigInteger.ZERO;    if (j.compareTo(BigInteger.ZERO) == 0) return BigInteger.ONE;    if ((i.subtract(j).compareTo(c)) <= 0){        return j.add(BigInteger.ONE).multiply(calculateProduct(i, j.subtract(BigInteger.ONE), c));    }else        return BigInteger.ONE;}
查看完整描述

2 回答

?
元芳怎么了

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊

看起來(lái)您正在添加 width 的滑動(dòng)窗口的產(chǎn)品c。如果您想提高性能,請(qǐng)擺脫遞歸并避免重新計(jì)算整個(gè)產(chǎn)品。使用在上一步中計(jì)算的乘積:將其乘以進(jìn)入窗口的數(shù)字并除以退出窗口的數(shù)字。除法速度較慢,但它會(huì)為更大的 值帶來(lái)回報(bào)c。


最后,雖然我會(huì)保留你的方法簽名,但你真的只需要BigInteger作為回報(bào)。


BigInteger getSum(BigInteger n, BigInteger c) {

    BigInteger p = BigInteger.ONE, sum = BigInteger.ZERO;


    for (BigInteger x = BigInteger.ONE; x.compareTo(n) < 0; x = x.add(BigInteger.ONE)) {

        p = p.multiply(x);

        if (x.compareTo(c) > 0) {

            p = p.divide(x.subtract(c));

        }

        sum = sum.add(p);

    }


    return sum;

}

如果您想進(jìn)一步加快速度,可以使用一些數(shù)學(xué)知識(shí)來(lái)避免在每一步都進(jìn)行除法。您的總和可以分解為s1 = sum[1,c) x!和s2 = sum[c,n) x!/(x-c)!。第二個(gè)總和等于n!/(n-c-1)!/(c+1)(來(lái)自hockey stick identity)。下面的方法不處理 c >=n 的簡(jiǎn)單情況。我會(huì)把它留給你。


private static BigInteger fasterSum(BigInteger n, BigInteger c) {

    assert c.compareTo(n) < 0;

    BigInteger sum = ZERO, p = ONE;


    for (BigInteger x = ONE; x.compareTo(c) < 0; x = x.add(ONE)) {

        p = p.multiply(x);

        sum = sum.add(p);

    }


    // sum[c,n) x!/(x-c)! = n!/(n-c-1)!/(c+1)

    p = ONE;

    for (BigInteger x = n.subtract(c); x.compareTo(n) <= 0; x = x.add(ONE)) {

        p = p.multiply(x);

    }

    sum = sum.add(p.divide(c.add(ONE)));


    return sum;

}



查看完整回答
反對(duì) 回復(fù) 2023-03-17
?
慕村225694

TA貢獻(xiàn)1880條經(jīng)驗(yàn) 獲得超4個(gè)贊

所以我假設(shè)你想添加一個(gè)列表BigInteger:

你可以通過(guò)使用減少操作來(lái)做到這一點(diǎn)(https://docs.oracle.com/javase/tutorial/collections/streams/reduction.html)


    List<BigInteger> list = new ArrayList<>();

            list.add(BigInteger.valueOf(5));

            list.add(BigInteger.valueOf(1));

            list.add(BigInteger.valueOf(3));

            list.add(BigInteger.valueOf(10));

            list.add(BigInteger.valueOf(2));


    BigInteger sum = list.stream().reduce((x, y) -> x.add(y)).get();

    System.out.println(sum);

這將計(jì)算總和,相當(dāng)于:


BigInteger sum = list.stream().reduce(BigInteger::add).get();

您還可以自己編寫(xiě)一個(gè)Collector可重用的并將 reduce 操作提取到那里:


public static Collector<BigInteger, ?, BigInteger> calculateSum() {

    return Collectors.reducing(BigInteger.ZERO, BigInteger::add);

}

然后做:


BigInteger sum = list.stream().collect(calculateSum());


查看完整回答
反對(duì) 回復(fù) 2023-03-17
  • 2 回答
  • 0 關(guān)注
  • 119 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)