嵌套For循环的高效替代方案

时间:2019-07-03 12:06:59

标签: java for-loop filter nested-loops profanity

我正在做亵渎过滤器。我有2个嵌套的for循环,如下所示。有没有更好的方法来避免嵌套的for循环并提高时间复杂度。

import flask, os, dash, logging
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
from ..server import server
from logging.handlers import RotatingFileHandler

external_stylesheets = [
    "some stylesheets"
]
df = pd.read_csv(open(os.path.abspath(
    "example.csv")), 'r', delimiter=',')
logging.info('Dash Application launched on Flask server')
app = dash.Dash(__name__, server=server,
                external_stylesheets=external_stylesheets, url_base_pathname="/dash")
app.config.suppress_callback_exceptions = True

data = df.copy()

def indicator(text, id_value, size):
    return html.Div(
        [
            html.Div(
                text,
                className="class1"
            ),
            html.Div(
                id_value,
                id=text,
                className="class2"
            ),
        ],
        className=size,
    )

3 个答案:

答案 0 :(得分:0)

如果要检查连续字符的所有可能组合,则假设您使用具有O(n^2)查找特征的Set,例如{{1} }。您可能可以通过将数据和黑名单分解为Trie结构并按照每种方式进行处理来减少这种情况。

一种更简单的方法可能是使用“亵渎总是在单词边界处开始和结束”这样的启发式方法。那你可以做

O(1)

答案 1 :(得分:0)

您不会在时间上提高很多,因为它们在后台使用了迭代,但是您可以将短语拆分为空格并遍历短语中的单词数组。 像这样:

String[] arrayWords = phrase.toLowerCase().split(" ");
for(String word:arrayWords){
    if(blacklistPhraseSet.contains(word)){
        isProfane = true;
        break;
    }
}

此代码的问题在于,除非您的单词包含复合词,否则它们将与那些词不匹配,而按照我的理解,您的代码将与之匹配。黑名单中的“ f ** k”一词在我的代码中与“ f ** kwit”不匹配,在您的代码中将与之匹配。

答案 2 :(得分:0)

考虑@Mad Physicist实现的 Java 8 版本:

        boolean isProfane = Stream.of(phrase.split("\\s+"))
            .map(String::toLowerCase)
            .anyMatch(w -> blacklistPhraseSet.contains(w));

        boolean isProfane = Stream.of(phrase
            .toLowerCase()
            .split("\\s+"))
            .anyMatch(w -> blacklistPhraseSet.contains(w));