首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Javascript (Node.js)中分析这个数组最有效的方法?

在Javascript (Node.js)中分析这个数组最有效的方法?
EN

Stack Overflow用户
提问于 2014-03-07 12:21:09
回答 5查看 410关注 0票数 3

首先,我想指出,这是服务器端的Node.js代码,而不是普通的客户端Javascript。我不想使用jQuery,但是使用任何本机Node.js方法(如果有可能有用的话)都可以。

这是纸牌游戏中机器人玩家的代码。机器人的卡片结构如下:

代码语言:javascript
复制
[ '9H', '10S', 'KD', '9D', '7D', 'QC', 'JC', '7C' ]

因此,这8张卡中的每一张都是作为value+suit字符串给出的。这是不能更改的,因为整个应用程序都使用这个结构。

现在,机器人必须分析这只手来寻找特定的卡片组合。例如,它应该找到任何“第三国王”(至少有两张同一套西装的两张较小的卡)、“第二张十张”(同一套西装中至少有一张小卡的皇后)或“第三皇后”。

在上面的例子中,它应该提出:钻石的第三王和俱乐部的第三皇后。

我正在考虑实现一个搜索算法来找到这些组合,但我担心这会非常低效。我的第一个想法是遍历数组,找到所有的国王、王后和10,并将这些数据保存在某个地方,然后再迭代一次,计算出我们有多少其他相同的卡。例如,对于国王:

代码语言:javascript
复制
var kingsuits = [];
for(var i=0;i<8;i++){
    if(hand[i].substr(0,1) == "K")
        kingsuits.push(hand[i].substr(-1));
}
//now kingsuits has the suits of all kings, and we can go through our hand again and check how many cards we have in each of these suits...

我的问题是,是否有更有效的方法来实现这一点?问题是,还有很多其他的组合也需要寻找,而不仅仅是我上面提到的例子。

此外--也许更重要的是--如果我们找到一个“第三国王”,我们根本不需要寻找“第三皇后”或“第二国王”。这些组合有一个清晰的层次结构,所以如果我们找到第一个组合,我们根本不需要关心其他的组合。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-03-07 13:32:07

使用二维hashmap或数组或其他类型的直接访问数据结构,其中存储特定类型的(布尔型)或多少(int)卡。例如:

代码语言:javascript
复制
[ '9H', '10S', 'KD', '9D', '7D', 'QC', 'JC', '7C' ]
=>
  | A  K  Q  J  10 9  8  7  6  5  4  3  2
--+--------------------------------------
C | 0  0  1  1  0  0  0  1  0  0  0  0  0
D | 0  1  0  0  0  1  0  0  0  0  0  0  0
H | 0  0  0  0  0  1  0  0  0  0  0  0  0
S | 0  0  0  0  1  0  0  0  0  0  0  0  0

这应该允许相当快速和简单的搜索结构-通过循环你可以快速识别有多个九,和有2俱乐部卡旁边的俱乐部女王。

不管您是为黑桃选择一个对象还是一个数组,哪个(适合还是值)是第一维度还是第二维度,这并不重要。对于值,您将需要使用数组来获得定义的顺序,即使映射(例如A->0,K->1,…)2->12)是非常规的。

票数 3
EN

Stack Overflow用户

发布于 2014-03-07 13:01:57

一种快速的解决办法是首先快速地将手按西装/号码顺序排序,即:

代码语言:javascript
复制
[ '9H', '10S', '7D', '9D', 'KD', '7C', 'JC', 'QC' ]

然后,通过单张单子,追踪迄今发现的一套西装中最长的牌序,例如:

代码语言:javascript
复制
var lastCard
var currentSequence
var bestSequence

for card in cards:
  if suitOf(card) = suitOf(lastCard) and numberOf(card) = numberOf(lastCard) + 1:
    append to currentSequence
  else:
    if currentSequence better than bestSequence:
      bestSequence = currentSequence
    clear currentSequence

当您找到“最佳”序列时,可以很容易地中止搜索。

票数 2
EN

Stack Overflow用户

发布于 2014-03-07 13:36:41

由于有很多关于您正在搜索的内容的未知信息,所以简单地对卡片进行排序就足够了,但是您可以考虑在对象(哈希表)中安排卡片,以便快速查找这些条件。

代码语言:javascript
复制
function value(s) {
    return s.substr(0, s.length - 1)
}

function suit(s) {
    return s.substr(-1)
}


function search(arr) {
    var suits = {
        S: {},
        C: {},
        D: {},
        H: {}
    }

    var count = {
        S: 0,
        C: 0,
        D: 0,
        H: 0
    }

    for (var i = 0; i < arr.length; i++) {
        var card = arr[i]
        var s = suit(card)
        var v = value(card)

        suits[s][v] = true
        count[s]++
    }

    // hunt in the structure here
}

这将允许您获取第三皇后,例如:

代码语言:javascript
复制
var thirdQueens = ["S", "C", "D", "H"].map(function (s) {
    var hash = suits[s]

    if (hash.Q && count[s] - (hash.K ? 1 : 0) >= 3) {
        return "Q" + s
    }
}).filter(function identity(x) { return x })
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22249959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档