- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在以下场景中是否存在比较数据的模式或最佳实践:
每个字母代表一个数据 block ,在我的例子中是 XML。
a+b+c+d
这些被合并为一个并返回。如果我事先合并了 a+b+c,那么识别这个“包”然后添加 d 将非常简单。但是如果我已经缓存了呢
a+c+d
然后 a+b+c+d 的请求来了,遍历所有这些可能的组合以确定将 b 添加到 a+c+d 包中会得到所需结果的最佳方法是什么?
合并数据的顺序并不重要。虽然它可能不会对答案产生任何影响,但代码是用 C# 4.0 编写的。
编辑再举一个例子:
可能的元素:a,b,c,d,e,f
假设我收到一个请求:a + c + d + e
意思是一个包含 0=a,1=c,2=d,3=e
的数组>
在我的“缓存”中,我有以下内容:c + d + e
already merged
然后根据要求我必须找到一种方法来做类似的事情:
if(cache.Contains(request.elements[0]+request.elements[1] etc...))
else(cache.Contains(request.elements[1] + request.elements[2] etc...))
它可能需要某种递归 for 循环,但由于在我的案例中可能的元素最终在 2-5000 范围内,因此它需要尽可能快速和高效。
最佳答案
据此:
“然后出现了对 a+b+c+d 的请求,运行所有这些可能的组合以确定将 b 添加到 a+c+d 包中的最佳方式是什么?想要的结果?”
我假设顺序无关紧要,所以如果您想要“abcd”,可以将“b”与“acd”合并。唯一重要的是包含哪些元素。
现在,我不知道您对 XML 使用什么或如何合并它,所以我写了这个合并字符串,并通过简单地连接它们来合并。您将不得不重写 Merge
方法来执行您想要执行的任何操作(并将所有位置的 string
更改为您正在使用的任何内容)。我还使用了整数而不是 a、b、c,因为我假设你拥有的整数比字母表中的字母多得多。
此外,例如当您正在寻找 a + b + c + d + e + f + g
时,缓存中的最佳匹配是 c + e + g + f
,那么它还会在缓存中寻找余数的最佳匹配,a + b + d
,以此类推,以进一步减少合并次数。如果你不想要这个(如果你的 xml,你不能将 a + b
与 c + d
合并到 a + b + c + d
),你可以在没有这个的情况下轻松地重写它,但它平均会做更多的合并。
这应该很快。查看 main 函数中的注释,看看它做了什么。
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication17
{
class CachedMerger
{
private Dictionary<HashSet<int>, string> _cache = new Dictionary<HashSet<int>, string>();
private Dictionary<int, string> _items = new Dictionary<int, string>();
public void AddItem(int index, string item)
{
_items[index] = item;
}
public void RemoveItem(int index)
{
_items.Remove(index);
}
private string Merge(string a, string b)
{
return a + b;
}
private string Merge(HashSet<int> list)
{
var sb = new StringBuilder();
foreach (var index in list)
{
if (!_items.ContainsKey(index))
return null;
else
sb.Append(_items[index]);
}
return sb.ToString();
}
public string Get(HashSet<int> query)
{
var bestMatchKey = BestMatchKey(query);
if (bestMatchKey == null)
{
var result = Merge(query);
if (result == null)
throw new Exception("Requested item not found in the item list.");
_cache[query] = result;
return result;
}
else
{
if (bestMatchKey.Count == query.Count)
return _cache[bestMatchKey];
var missing = new HashSet<int>();
foreach (var index in query)
if (!bestMatchKey.Contains(index))
missing.Add(index);
return Merge(_cache[bestMatchKey], Get(missing));
}
}
private HashSet<int> BestMatchKey(HashSet<int> set)
{
int bestCount = 0;
HashSet<int> bestKey = null;
foreach (var entry in _cache)
{
var key = entry.Key;
int count = 0;
bool fail = false;
foreach (var i in key)
{
if (set.Contains(i))
{
count++;
}
else
{
fail = true;
break;
}
}
if (!fail && count > bestCount)
{
bestKey = key;
bestCount = count;
}
}
return bestKey;
}
}
class Program
{
static void Main(string[] args)
{
var cm = new CachedMerger();
// Add all the base parts
cm.AddItem(0, "sjkdlajkld");
cm.AddItem(1, "dffdfdfdf");
cm.AddItem(2, "qwqwqw");
cm.AddItem(3, "yuyuyuyy");
cm.AddItem(4, "kjkjkjkjkj");
cm.AddItem(5, "oioyuyiyui");
// This will merge 0 + 1 + 3 + 4 since the cache is empty
Console.WriteLine(cm.Get(new HashSet<int> { 0, 1, 3, 4 }));
// This will merge 2 + 5 as there is no match in the cache
Console.WriteLine(cm.Get(new HashSet<int> { 2, 5 }));
// This will merge (2 + 5) from the cache with 3
Console.WriteLine(cm.Get(new HashSet<int> { 2, 3, 5 }));
// This will merge (0 + 1 + 3 + 4) from the cache with (2 + 5) from the cache
Console.WriteLine(cm.Get(new HashSet<int> { 0, 1, 2, 3, 4, 5 }));
Console.Read();
}
}
}
关于c# - 数据设计模式的可比合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20000513/
对此感到疯狂,真的缺少一些东西。 我有webpack 4.6.0,webpack-cli ^ 2.1.2,所以是最新的。 在文档(https://webpack.js.org/concepts/mod
object Host "os.google.com" { import "windows" address = "linux.google.com" groups = ["linux"] } obj
每当我安装我的应用程序时,我都可以将数据库从 Assets 文件夹复制到 /data/data/packagename/databases/ .到此为止,应用程序工作得很好。 但 10 或 15 秒后
我在 cc 模式缓冲区中使用 hideshow.el 来折叠我不查看的文件部分。 如果能够在 XML 文档中做到这一点就好了。我使用 emacs 22.2.1 和内置的 sgml-mode 进行 xm
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
根据java: public Scanner useDelimiter(String pattern) Sets this scanner's delimiting pattern to a patt
我读过一些关于 PRG 模式以及它如何防止用户重新提交表单的文章。比如this post有一张不错的图: 我能理解为什么在收到 2xx 后用户刷新页面时不会发生表单提交。但我仍然想知道: (1) 如果
看看下面的图片,您可能会清楚地看到这一点。 那么如何在带有其他一些 View 的简单屏幕中实现没有任何弹出/对话框/模式的微调器日期选择器? 我在整个网络上进行了谷歌搜索,但没有找到与之相关的任何合适
我不知道该怎么做,我一直遇到问题。 以下是代码: rows = int(input()) for i in range(1,rows): for j in range(1,i+1):
我想为重写创建一个正则表达式。 将所有请求重写为 index.php(不需要匹配),它不是以/api 开头,或者不是以('.html',或'.js'或'.css'或'.png'结束) 我的例子还是这样
MVC模式代表 Model-View-Controller(模型-视图-控制器) 模式 MVC模式用于应用程序的分层开发 Model(模型) - 模型代表一个存取数据的对象或 JAVA PO
我想为组织模式创建一个 RDF 模式世界。您可能知道,组织模式文档基于层次结构大纲,其中标题是主要的分组实体。 * March auxiliary :PROPERTIES: :HLEVEL: 1 :E
我正在编写一个可以从文件中读取 JSON 数据的软件。该文件包含“person”——一个值为对象数组的对象。我打算使用 JSON 模式验证库来验证内容,而不是自己编写代码。符合代表以下数据的 JSON
假设我有 4 张 table 人 公司 团体 和 账单 现在bills/persons和bills/companys和bills/groups之间是多对多的关系。 我看到了 4 种可能的 sql 模式
假设您有这样的文档: doc1: id:1 text: ... references: Journal1, 2013, pag 123 references: Journal2, 2014,
我有这个架构。它检查评论,目前工作正常。 var schema = { id: '', type: 'object', additionalProperties: false, pro
这可能很简单,但有人可以解释为什么以下模式匹配不明智吗?它说其他规则,例如1, 0, _ 永远不会匹配。 let matchTest(n : int) = let ran = new Rand
我有以下选择序列作为 XML 模式的一部分。理想情况下,我想要一个序列: 来自 my:namespace 的元素必须严格解析。 来自任何其他命名空间的元素,不包括 ##targetNamespace和
我希望编写一个 json 模式来涵盖这个(简化的)示例 { "errorMessage": "", "nbRunningQueries": 0, "isError": Fals
首先,我是 f# 的新手,所以也许答案很明显,但我没有看到。所以我有一些带有 id 和值的元组。我知道我正在寻找的 id,我想从我传入的三个元组中选择正确的元组。我打算用两个 match 语句来做到这
我是一名优秀的程序员,十分优秀!