`
garyzhangmin
  • 浏览: 1506 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

js排列组合的性能问题

阅读更多
此段代码为一个求数组所有排列组合的方法,当数组元素个数大于7时,运行效率及底,有什么更好的方法改进他的算法,愿请达人帮助


<SCRIPT LANGUAGE="JavaScript">

<!--
/**
* 克隆数组
*/
Array.prototype.clone = function () {
    return this.concat();
};

/**
* 按指定的顺序数组重新排列
*/
Array.prototype.reOrder = function ( aOrder ) {
    var aClone = this.clone();
    for (var i=0; i < aOrder.length; i++) {
        this[aOrder[i]] = aClone[i];
    }
    return this;
};

/**
* 取得 0 到 iLen 的所有排列顺序
*/
function getOrders( iLen ) {
    var aResult = [];
    var aNum = [];
    var aNumFlag = [];
    var i, j;
    for(i = 0; i < iLen; i++) {
        aNum[i] = i,
        aNumFlag[i] = 1;
    }
   
    for(;;){
        aResult.push(aNum.clone());
        aNumFlag[aNum[iLen-1]] = 0;
        for(i = iLen - 2; i>=0; i--){
            aNumFlag[aNum[i]] = 0;
            if(aNum[i] < aNum[i+1]) {
                break;
            }
        }
        if( i < 0) {
            break;
        }

        for(j = aNum[i] + 1; j < iLen; j++){
            if(!aNumFlag[j]) {
                break;
            }
        }

        aNumFlag[j] = 1;
        aNum[i] = j;
        for(j=0, i++; i < iLen; j++) {
            if(!aNumFlag[j]) {
                aNum[i++] = j;
                aNumFlag[j] = 1;
            }
        }
    }
    return aResult;
}

/**
* 生成数组的全排列
* 方法: 先生成数组长度以下的所有顺序, 然后根据顺序数组重排原数组
*/
function arrayInAllOrder( aData ) {
    var aResult = [];
    var aOrders = getOrders(aData.length);
    var aOrder = aOrders.shift();
    while(aOrder) {
        aResult.push(aData.clone().reOrder(aOrder));
        aOrder = aOrders.shift();
    }
    return aResult;
}


var others=new Array();
others[0]=0;
others[1]=1;
others[2]=2;
others[3]=3;
others[4]=4;
others[5]=5;
others[6]=6;
others[7]=7;
// others[8]=8;
// others[9]=9;
var result=arrayInAllOrder(others);
alert(result.length);



//-->
</SCRIPT>
分享到:
评论
1 楼 garyzhangmin 2008-10-17  
性能问题可能有两部分引起的,一个是循环次数另外一个是clone了太多的不同排列组合的数组,消耗了太多的资源。

相关推荐

    JS实现的排列组合算法示例

    JavaScript中的排列组合算法是指在编程过程中,根据数学中的排列组合原理,通过编写代码来计算给定数集中选取特定数量元素的所有可能组合情况。这一概念在计算机科学和软件开发中十分常见,尤其是在涉及概率统计、...

    js代码-排列组合去重算法

    在JavaScript编程中,排列组合去重算法是一种常见的问题,特别是在处理数据集合时,例如筛选唯一组合、优化存储或计算效率等场景。这个问题涉及到数组操作、循环、条件判断以及可能的递归方法。以下是对这个主题的...

    js实现简单排列组合的方法

    在JavaScript中,排列组合是一种常见的算法问题,它涉及到数组和字符串的操作。排列是指从给定元素集合中选择若干个元素,并按照一定的顺序进行排列;组合则是指不考虑元素顺序的选择。在本例中,我们探讨如何使用...

    JS取数字组合.rar

    数字组合是数学中排列组合的一部分,它不考虑元素的顺序,只关心哪些元素被选中。例如,如果我们有一个数字集合`[1, 2, 3]`,组合可能包括`[1, 2]`,`[1, 3]`,`[2, 3]`,但不包括顺序不同的组合,如`[2, 1]`。 在...

    JavaScript凌厉开发——Ext JS3详解与实践

    《JavaScript凌厉开发——Ext JS3详解与实践》是一本深度探讨JavaScript库Ext JS3的专著,旨在帮助开发者深入理解和高效运用这一强大的前端框架。本文将围绕标题、描述及标签,详细介绍Ext JS3的核心概念、关键特性...

    JavaScript实现消消乐

    JavaScript还需要处理用户的交互,如重新排列、提示、暂停/继续等操作,确保用户能顺畅地进行游戏。 9. **事件驱动编程**: JavaScript的事件驱动模型非常适合游戏开发,通过监听各种用户事件,如点击、触摸等,...

    js-combinations:返回提供的数据集的组合

    在JavaScript中,它们可以用于生成测试用例、解决组合问题(如排列组合问题)或者进行数据筛选。 7. **代码示例**: 假设我们有一个数组 `[1, 2, 3, 4]`,要找到所有两元素的组合,我们可以这样调用库: ```...

    js代码-计算C(N,K)

    在JavaScript编程语言中,"js代码-计算C(N,K)"通常指的是实现组合数学中的组合(Combination)计算的代码。组合是无序集合的选择,不考虑元素的顺序,表示为C(N, K)或N选K,其中N是总的元素数量,K是选择的元素数量...

    js代码-10.2 返回所有存在的组合

    在JavaScript编程中,"返回所有存在的组合"是一个常见的问题,特别是在处理数据的排列组合或算法设计时。这个任务通常涉及到深度优先搜索(DFS)或回溯算法,它们可以帮助我们找到一个集合的所有可能子集或组合。...

    jQuery图片排列动画效果

    - `js`:这个文件夹包含了JavaScript代码,其中的`script.js`或类似文件可能包含了实现动画效果的具体逻辑。jQuery的选择器和方法会被用来选中图片元素,然后应用动画效果。可能还会有事件监听器来捕捉用户的交互,...

    JavaScript凌厉开发(Ext_JS_3详解与实践

    《JavaScript凌厉开发(Ext_JS_3详解与实践)》这本书深入浅出地探讨了JavaScript编程中的高级技术,特别是对Ext JS 3框架的应用。Ext JS是一个强大的客户端JavaScript库,它提供了一整套用于构建富互联网应用(RIA)...

    仿微信群组图片组合头像

    开发者可能需要利用编程语言(如Python的PIL库,JavaScript的sharp或canvas库,Java的JavaFX或Swing)来处理图片,确保每个成员的头像在组合后保持合适的大小和位置。 2. **算法设计**:为了美观地排列头像,需要...

    javascript使用递归算法求两个数字组合功能示例

    在JavaScript编程中,递归算法是一种强大的工具,用于解决复杂问题,尤其是涉及到组合和排列的问题。本示例探讨了如何使用递归算法来找到两个数字的组合。在给定的代码中,目标是生成数组`arr`中的每对数字的所有...

    量化例子学习.js,量化分析的例子,JavaScript源码.zip

    "量化分析的例子"可能是一个文档,详细解释了上述JavaScript代码背后的逻辑和应用场景,或者提供了一些实际的量化分析问题的实例。 "JavaScript源码.zip"是整个压缩包,包含所有这些资源。解压后,开发者可以阅读和...

    jQuery缩略图网格排列大图切换代码.zip

    在本项目中,"jQuery缩略图网格排列大图切换代码.zip" 提供了一种使用JavaScript库jQuery实现的创新图片展示方法。这个解决方案的核心在于它能够将一组缩略图以网格的形式排列,同时具备交互性,允许用户点击任何...

    不规则图片

    9. **优化**:大量复杂的不规则线条可能导致性能问题,因此需要考虑优化策略,如使用Web Workers进行离线计算,或者使用GPU加速(WebGL)。 10. **保存和导出**:完成绘制后,可以使用`toDataURL()`方法将Canvas...

    js代码-10.1 全排列问题

    全排列问题是一个经典的计算机科学问题,...总之,全排列问题展示了JavaScript在处理组合问题上的能力,而回溯算法则是解决这类问题的一种有效工具。通过理解和实现这样的算法,开发者可以提高解决复杂编程问题的能力。

    仿微信群聊组合头像

    九宫格布局是一种常见的组合头像排列方式,它源于中国古代的风水学说,后来被广泛应用于摄影构图和设计中。在九宫格中,图像被分为9个相等的部分,四个交叉点是视觉焦点所在,这四个点可以用来放置头像,使整体布局...

    JS原生双栏穿梭选择框

    在JavaScript的世界里,"JS原生双栏穿梭选择框"是一种常见的交互元素,它通常用于数据筛选、...在实际开发中,还需要考虑兼容性、性能优化以及无障碍访问(accessibility)等问题,以确保应用能在各种环境下良好运行。

Global site tag (gtag.js) - Google Analytics