需要在基于PHP的商店中进行算法实现和创建的建议

时间:2011-12-05 14:48:04

标签: php algorithm

现在好几天,我正在尝试处理我在PHP写的在线商店的算法实现。我不知道问题是否只是实现,或者可能是错误的算法设计。 Hovewer,对我来说似乎很好。我只是没有检查它的复杂性,但这是一个问题。

经过对同一算法的长时间考虑,没有考虑实现,我想出了二进制搜索树(bst)的使用,其中插入到列表中的其他数据由用户定义的信息组成(稍后关于它)。将显示整个订单列表,或使用inorder方法返回。

我是这样写的:

  • 如果输入对象日期大于当前对象,请右键单击

  • 如果输入对象日期小于当前对象,请左转

  • 如果日期相同,

  • 如果该字段为空,请检查产品是否有库存

    • 如果已落实并完成

    • 如果没有做任何事情并退出

  • 如果字段已满

{检查列表中是否为此用户ID

  • 如果是,则检查订单优先级

  • 如果没有做任何事情并退出

    • 检查库存中是否有产品
  • 如果是,则替换记录并退出

  • 如果没有做任何事情并退出 }

{如果列表中没有用户ID,请检查产品是否有库存

  • 如果是,则将元素放在最后

  • 如果没有做任何事情并退出

}

也许它看起来有点不好,但我无法做缩进。

数据在循环中传输到算法中,直到订单列表结束。该清单无序。

这是我的实施:

class BinaryTree {    
    private $predescor = array(
        'd'=>array('data'=>0),
        'p'=>null,
        'r'=>null,
        'l'=>null
    );

    private $ancestor = array(
        'd'=>array('data'=>0),
        'p'=>null,
        'r'=>null,
        'l'=>null
    );

    private $i = 0;

    public function insertIntoTree(&$root,$element)
    {
        $this->predescor = $root;
        $this->predescor;

        while($this->predescor)
        {
            if($element['d']['data']==$this->predescor['d']['data'])
            {
                $this->inertIntoList($element,$this->predescor['d']);
                return true;
            }

            $this->predescor = $this->predescor;
            if($element['d']['data']<$this->predescor['d']['data'])
            {
                $this->predescor = $this->predescor['l'];
            }
            else
            {
                $this->predescor = $this->predescor['r'];
            }
        }

        $element['p'] = $this->predescor;

        if(!$this->predescor)
        {
            $root = $element;
        }
        else if($element['d']['data']<$this->predescor['d']['data'])
        {
            $this->predescor['l'] = $element;
        }
        else
        {
            $this->predescor['r'] = $element;
        }

        return true;
    }    
    public function putList(&$list,$root)
    {
        if($root!=null)
        {
            $this->putList($list, $root['l']);
            $lista[$this->i] = $root;
            $this->i++;
            $this->putList($list, $root['r']);
        }
        return;
    }

    private function insertIntoList($element,&$position)
    {
        if($position == null)
        {
            $position = $element;
            return true;
        }

        foreach($position['user'] as &$key)
        {
            if($key == $element['d']['user'])
            {
                if($key['priority']<$element['d']['user']['priority'])
                {
                    return false;
                }
                else if($key['priority']==$element['d']['user']['priority'])
                {
                    return false;
                }
                else
                {
                    if(Orders::checkOrder($element['d']['user']['order']))
                    {
                        $key['order'] = $element['d']['user']['order'];
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
        }

        //@todo add at the end
        return true;
    }
}

我想建议是否有比使用由非常复杂的数组组成的bst更简单的方法,这也更容易实现?因为现在我不能用PHP来补充它。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

我不会通过在php中编码来启动

我将启动,将其构建到数据库中。 (“订单”意味着数据库。)我通过澄清几点来开始。假设一个订单可以包含多个订单项。 。

  • 自上次订单以来的天数似乎明显适用于订单, 不是针对个别产品。
  • 用户可以“一次只携带一个请求”。要求 什么?似乎没有意义,这适用于 将订购到订单的订单项。
  • 订单优先顺序似乎明确适用于订单,而不是订单 项目。但是项目优先级可能更有意义。 (客户需要哪些产品首先?)
  • 产品是否有库存似乎适用于订单项,而不是 整个订单。

我通过创建两个视图开始。 (不是因为你最终需要两个观点,但因为有些事情仍然不清楚。)

一个与应用于订单的“排名”有关的视图会计算或显示三件事。

  • 自上次订单以来的天数。
  • 此订单是“一次一个请求”吗?
  • 订单优先。

如果分配给这三件事的数字在比例上是一致的,那么您可以对这三列进行排序。但那不太可能。您可能需要对每个因素进行加权,可能需要乘以“加权”因子。对结果进行计算应该可以让它们按照有用的顺序排列。目前尚不清楚计算最好是在视图中还是在存储过程中完成。

另一种观点与订单项是否有货有关。目前尚不清楚一个缺货商品是否意味着整个订单不完整,或者缺货中的一个订单项是否会改变与上述其他订单一起扩展的加权数字的计算。 (你可以为每种方法提出一个很好的论据。)