我正在做亵渎过滤器。我有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,
)
答案 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));