- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一组数据和一组要针对该数据运行的搜索过滤器。过滤器遵循 LDAP 搜索过滤器格式,并被解析为表达式树。数据一次读取一项,并通过所有过滤器进行处理。中间匹配结果存储在树的每个叶节点中,直到处理完所有数据。然后通过遍历树并将逻辑运算符应用于每个叶节点的中间结果来获得最终结果。例如,如果我有过滤器 (&(a=b)(c=d))
那么我的树将如下所示:
root = "&"
left = "a=b"
right = "c=d"
因此,如果 a=b
和 c=d
则左右子节点都匹配,因此过滤器匹配。
数据是不同类型对象的集合,每个对象都有自己的字段。例如,假设集合代表学校的一个类(class):
class { name = "math" room = "12A" }
teacher { name = "John" age = "35" }
student { name = "Billy" age = "6" grade = "A" }
student { name = "Jane" age = "7" grade = "B" }
因此过滤器可能看起来像 (&(teacher.name=John)(student.age>6)(student.grade=A))
并像这样解析:
root = "&"
left = "teacher.name=John"
right = "&"
left = "student.age>6"
right = "student.grade=A"
我针对它运行 class
对象;无匹配。我针对它运行 teacher
对象; root.left
是匹配项。我针对它运行第一个 student
节点; root.right.right
是匹配项。我针对它运行第二个 student
节点; root.right.left
是匹配项。然后我遍历树,确定所有节点都匹配,因此最终结果是匹配的。
问题是中间匹配需要根据共性进行约束:student.age
和 student.grade
过滤器需要以某种方式绑定(bind)在一起以便存储仅当它们匹配同一对象时才为中间匹配。我一辈子都想不出该怎么做。
我的过滤节点抽象基类:
class FilterNode
{
public:
virtual void Evaluate(string ObjectName, map<string, string> Attributes) = 0;
virtual bool IsMatch() = 0;
};
我有一个 LogicalFilterNode
类,它处理逻辑 AND、OR 和 NOT 运算;它的实现非常简单:
void LogicalFilterNode::Evaluate(string ObjectName, map<string, string> Attributes)
{
m_Left->Evaluate(ObjectName, Attributes);
m_Right->Evaluate(ObjectName, Attributes);
}
bool LogicalFilterNode::IsMatch()
{
switch(m_Operator)
{
case AND:
return m_Left->IsMatch() && m_Right->IsMatch();
case OR:
return m_Left->IsMatch() || m_Right->IsMatch();
case NOT:
return !m_Left->IsMatch();
}
return false;
}
然后我有一个处理叶节点的 ComparisonFilterNode
类:
void ComparisonFilterNode::Evaluate(string ObjectName, map<string, string> Attributes)
{
if(ObjectName == m_ObjectName) // e.g. "teacher", "student", etc.
{
foreach(string_pair Attribute in Attributes)
{
Evaluate(Attribute.Name, Attribute.Value);
}
}
}
void ComparisonFilterNode::Evaluate(string AttributeName, string AttributeValue)
{
if(AttributeName == m_AttributeName) // e.g. "age", "grade", etc.
{
if(Compare(AttributeValue, m_AttributeValue) // e.g. "6", "A", etc.
{
m_IsMatch = true;
}
}
}
bool ComparisonFilterNode::IsMatch() { return m_IsMatch; }
使用方法:
FilterNode* Root = Parse(...);
foreach(Object item in Data)
{
Root->Evaluate(item.Name, item.Attributes);
}
bool Match = Root->IsMatch();
本质上,我需要的是 AND 语句,其中子项具有相同的对象名称,AND 语句应该仅在子项匹配同一对象时才匹配。
最佳答案
创建一个新的一元“运算符”,我们称它为thereExists
,它:
具体来说,对于表达式树中 thereExists
运算符的每个实例,您应该存储一个位来指示此树节点下的子表达式是否已被任何输入记录满足远的。这些标志最初将设置为 false
。
要继续有效地处理您的数据集(即逐个输入记录,而不必将整个数据集加载到内存中),您应该首先预处理查询表达式树以提取 thereExists 的所有实例的列表
运算符。然后,当您读入每条输入记录时,针对仍将其 satisfied
标志设置为 false
的每个运算符的子表达式对其进行测试。现在满足的任何子表达式都应该将其父 thereExists
节点的 satisfied
标志切换为 true
—— 最好也附加一个将满意记录的副本复制到新满足的 thereExists
节点,如果您实际上想看到的不仅仅是对整个查询的"is"或“否”答案。
在所有输入记录都按上述方式处理后,您只需要对 thereExists
节点上方的树节点求值一次。请注意,任何引用单个记录属性的内容必须出现在树中thereExists
节点下方的某处。树中 thereExists
节点之上的所有内容都只允许测试集合的“全局”属性,或使用逻辑运算符(AND、OR、异或、非等)。逻辑运算符本身可以出现在树中的任何位置。
使用它,您现在可以评估像这样的表达式
root = "&"
left = thereExists
child = "teacher.name=John"
right = "|"
left = thereExists
child = "&"
left = "student.age>6"
right = "student.grade=A"
right = thereExists
child = "student.name = Billy"
如果记录集合中包含名为“John”的教师和名为“Billy”的学生或年龄超过 6 岁的 A 学生,则报告"is",否则为“否”。如果您按照我的建议跟踪令人满意的记录,您也可以在回答"is"的情况下将这些记录转储。
您还可以添加第二个运算符类型,forAll
,它检查其子表达式对于每个 输入记录是否为真。但这可能没那么有用,无论如何你都可以用 not(thereExists(not(expr)))
模拟 forAll(expr)
。
关于algorithm - 如何根据增量数据评估复杂的表达式树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19548638/
我在一本书(Interview Question)中读到这个问题,想在这里详细讨论这个问题。请点亮它。 问题如下:- 隐私和匿名化 马萨诸塞州集团保险委员会早在 1990 年代中期就有一个绝妙的主意
我最近接受了一次面试,面试官给了我一些伪代码并提出了相关问题。不幸的是,由于准备不足,我无法回答他的问题。由于时间关系,我无法向他请教该问题的解决方案。如果有人可以指导我并帮助我理解问题,以便我可以改
这是我的代码 public int getDist(Node root, int value) { if (root == null && value !=0) return
就效率而言,Strassen 算法应该停止递归并应用乘法的最佳交叉点是多少? 我知道这与具体的实现和硬件密切相关,但对于一般情况应该有某种指南或某人的一些实验结果。 在网上搜索了一下,问了一些他们认为
我想学习一些关于分布式算法的知识,所以我正在寻找任何书籍推荐。我对理论书籍更感兴趣,因为实现只是个人喜好问题(我可能会使用 erlang(或 c#))。但另一方面,我不想对算法进行原始的数学分析。只是
我想知道你们中有多少人实现了计算机科学的“ classical algorithms ”,例如 Dijkstra's algorithm或现实世界中的数据结构(例如二叉搜索树),而不是学术项目? 当有
我正在解决旧编程竞赛中的一些示例问题。在这个问题中,我们得到了我们有多少调酒师以及他们知道哪些食谱的信息。制作每杯鸡尾酒需要 1 分钟,我们需要使用所有调酒师计算是否可以在 5 分钟内完成订单。 解决
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我开始学习 Nodejs,但我被困在中间的某个地方。我从 npm 安装了一个新库,它是 express -jwt ,它在运行后显示某种错误。附上代码和错误日志,请帮助我! const jwt = re
我有一个证书,其中签名算法显示“sha256rsa”,但指纹算法显示“sha1”。我的证书 SHA1/SHA2 的标识是什么? 谢谢! 最佳答案 TL;TR:签名和指纹是完全不同的东西。对于证书的强度
我目前在我的大学学习数据结构类(class),并且在之前的类(class)中做过一些算法分析,但这是我在之前的类(class)中遇到的最困难的部分。我们现在将在我的数据结构类(class)中学习算法分
有一个由 N 个 1x1 方格组成的区域,并且该区域的所有部分都是相连的(没有任何方格无法到达的方格)。 下面是一些面积的例子。 我想在这个区域中选择一些方块,并且两个相邻的方块不能一起选择(对角接触
我有一些多边形形状的点列表,我想将其包含在我页面上的 Google map 中。 我已经从原始数据中删除了尽可能多的不必要的多边形,现在我剩下大约 12 个,但它们非常详细以至于导致了问题。现在我的文
我目前正在实现 Marching Squares用于计算等高线曲线,我对此处提到的位移位的使用有疑问 Compose the 4 bits at the corners of the cell to
我正在尝试针对给定算法的约束满足问题实现此递归回溯函数: function BACKTRACKING-SEARCH(csp) returns solution/failure return R
是否有包含反函数的库? 作为项目的一部分,我目前正在研究测向算法。我正在使用巴特利特相关性。在 Bartlett 相关性中,我需要将已经是 3 次矩阵乘法(包括 Hermitian 转置)的分子除以作
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
问题的链接是UVA - 1394 : And There Was One . 朴素的算法是扫描整个数组并在每次迭代中标记第 k 个元素并在最后停止:这需要 O(n^2) 时间。 我搜索了一种替代算法并
COM 中创建 GUID 的函数 (CoCreateGUID) 使用“分散唯一性算法”,但我的问题是,它是什么? 谁能解释一下? 最佳答案 一种生成 ID 的方法,该 ID 具有一定的唯一性保证,而不
在做一个项目时我遇到了这个问题,我将在这个问题的实际领域之外重新措辞(我想我可以谈论烟花的口径和形状,但这会使理解更加复杂).我正在寻找一种(可能是近似的)算法来解决它。 我有 n 个不同大小的容器,
我是一名优秀的程序员,十分优秀!