人脑信息与外界信息匹配
需要明确的是,定界符是指数学定界符-括号,花括号和方括号。 另外,本文还将讨论我编写的java class
中用作库的代码。 您可以在此处查看回购。 好吧,顺便说一句,走吧!
第1部分-自动完成
介绍
几个月前,我需要在其中一个程序中具有自动完成定界符功能。 我从来没有真正考虑过如何做,因为这确实不是刚刚发生的事情。 我的意思是说,您是否曾经手动地一步一步思考如何匹配尚未在程序中关闭的那个开放括号 ? 不,你只是本能地知道。 您的大脑非常擅长检测和匹配 模式 。 但是程序没有instincts
。 那么,这种模式匹配背后的算法是什么? 大脑如何逐步做到这一点?
在开始解释之前, 强烈建议您在github上检查代码并继续学习! 如果将来需要,可以随意导入class
:)
算法
好吧,只需检查表达式中的开始定界符(即(
, {
和[
))的数量,然后将结束定界符的数量放在末尾即可!因此,如果给定log(sin(2^(5
您只需输入3最后用括号括起来,对吗?
没那么快。 如果表达式是log(sin(2^(5)
? log(sin(2^(5)
现在不能放3个关闭定界符,必须放2个 ,因为1 已经关闭 。所以我们不能只计算打开定界符的外观,我们还必须1) 计算结束定界符的数量 ,2) 抓住2和3 之间的差 ,然后3) 追加 。
一切都很好,但是我们还没有完成。 混合定界符呢? 像这样log[sin(2^{
。现在,我们终于可以逐步讨论最有趣的部分,一步你的大脑如何做(可能)它。
简而言之,您的大脑只是非常快速地 向后扫描表情。 如果看到打开的分隔符,则立即将相应的关闭的分隔符附加到表达式中。 现在,添加上述有关检查混音出现次数的段落,无论您输入什么表达式,它都将始终输出完美匹配的输出表达式 。
您可以在实现这整个事情的switch
语句是检查各单位表达(即log
, sin
, cos
, (
, {
, )
....)像这样在Java
-
// Inside the Switch statement
case "(":
++openingParentheses;
if (openingParentheses > closingParentheses) {
resultstr.append(")");
closingParentheses++;
}
break;
现在,您只需要将整个switch
语句放入reverse iterator
循环中即可!
它在起作用!
请注意,尽管前端仅显示括号,但后端对不同的功能使用不同的定界符,因此它仍使用完全相同的算法
第2部分-与给定的结束定界符关联的功能
介绍
完成自动完成功能后,我需要确切知道哪个函数与哪个定界符相关联。 假设您给了这个表达式log10[sin(23^{56*cos(loge[2])})]
,并被告知找出倒数第二个括号属于哪个函数。 在这种情况下,那属于cos
。 但是其背后的算法是什么?
算法
同样,如果您还没有的话,建议您打开源代码
再次,我们对表达式进行反向迭代 ,这一次,我们还需要用户提供的索引 ,并且表达式必须是array ,以分隔每个单元表达式。 表达式log10[sin(23^{56*cos(loge[2])})]
,如果转换为String
数组,则将-
{"log10", "[", "sin", "(", "23", "^", "{", "56", "*", "cos", "(", "loge", "[", "2", "]", ")", "}", ")", "]"}
这次,我们从给定索引开始反向迭代,但跳过索引本身。 因此,此数组中倒数第二个括号的索引为15
。 因此,我们将从14
开始反向迭代。
现在,必须继续进行反向迭代, 直到打开分隔符的出现次数大于 (不等于)闭合分隔符的出现次数为止 。 循环停止的瞬间,wallah !,您可以神奇地获得相应功能的索引,在这种情况下为cos
。
好吧,这不是魔术,但您知道我的意思。
如果要在括号( (
)。中实现此功能,则可以这样做;
while (openParentheses <= closeParentheses) {
switch (expression[i]) {
case ")":
closeParentheses++;
break;
case "(":
openParentheses++;
break;
}
i--;
}
结果i
是函数的索引。
它在起作用!
请注意,每当我使用退格键删除闭合定界符时,程序都可以判断我刚刚输入的功能区域
结论
而已! 那就是你的大脑做到的(可能)。 一开始我发现它真的很吸引人,当我弄清楚该算法时,感觉真的很棒。 我想与大家分享!
再一次,如果您需要在任何java
程序中使用它,我亲自在Android
开发人员中使用了它,您只需从存储库中获取.jar
文件即可!
翻译自: https://dev.to/totally_chase/how-is-the-human-brain-so-good-at-matching-delimiters-1o51
人脑信息与外界信息匹配